web-dev-qa-db-fra.com

Comment vérifier si une méthode existe au moment de l'exécution en Java?

Comment procéder pour vérifier si une méthode existe pour une classe en Java? Un try {...} catch {...} la déclaration est-elle une bonne pratique?

18
jrtc27

Je suppose que vous voulez vérifier la méthode doSomething(String, Object).

Vous pourriez essayer ceci:

boolean methodExists = false;
try {
  obj.doSomething("", null);
  methodExists = true;
} catch (NoSuchMethodError e) {
  // ignore
}

Cela ne fonctionnera pas, car la méthode sera résolue au moment de la compilation.

Vous devez vraiment utiliser la réflexion pour cela. Et si vous avez accès au code source de la méthode que vous souhaitez appeler, il est encore mieux de créer une interface avec la méthode que vous souhaitez appeler.

[Mise à jour] Les informations supplémentaires sont les suivantes: Il existe une interface qui peut exister en deux versions, une ancienne (sans la méthode souhaitée) et une nouvelle (avec la méthode souhaitée). Sur cette base, je suggère ce qui suit:

package so7058621;

import Java.lang.reflect.Method;

public class NetherHelper {

  private static final Method getAllowedNether;
  static {
    Method m = null;
    try {
      m = World.class.getMethod("getAllowedNether");
    } catch (Exception e) {
      // doesn't matter
    }
    getAllowedNether = m;
  }

  /* Call this method instead from your code. */
  public static boolean getAllowedNether(World world) {
    if (getAllowedNether != null) {
      try {
        return ((Boolean) getAllowedNether.invoke(world)).booleanValue();
      } catch (Exception e) {
        // doesn't matter
      }
    }
    return false;
  }

  interface World {
    //boolean getAllowedNether();
  }

  public static void main(String[] args) {
    System.out.println(getAllowedNether(new World() {
      public boolean getAllowedNether() {
        return true;
      }
    }));
  }
}

Ce code teste si la méthode getAllowedNether existe dans l'interface, donc peu importe si les objets réels ont la méthode ou non.

Si la méthode getAllowedNether doit être appelée très souvent et que vous rencontrez des problèmes de performances à cause de cela, je devrai penser à une réponse plus avancée. Celui-ci devrait être bien pour l'instant.

26
Roland Illig

L'API de réflexion renvoie NoSuchMethodException lors de l'utilisation des fonctions Class.getMethod(...).

Sinon, Oracle propose un joli didacticiel sur la réflexion http://download.Oracle.com/javase/tutorial/reflect/index.html

5
Jaka

Dans Java c'est ce qu'on appelle la réflexion. L'API vous permet de découvrir des méthodes et de les appeler au moment de l'exécution. Voici un pointeur vers les documents. C'est une syntaxe assez verbeuse mais cela fera le travail:

http://Java.Sun.com/developer/technicalArticles/ALT/Reflection/

4
bcurren

J'utiliserais une méthode distincte pour gérer l'exception et avoir une vérification nulle pour vérifier si la méthode existe

Ex: if (null! = GetDeclaredMethod (obj, "getId", null)) faites votre travail ...

private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) {
    // TODO Auto-generated method stub
    try {
        return obj.getClass().getDeclaredMethod(name, parameterTypes);
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
} 
3
Supun Sameera