5 votes

En utilisant la réflexion Java pour créer la méthode eval()

Je me pose une question sur la réflexion J'essaie d'avoir une sorte de méthode eval(). Ainsi, je peux appeler par exemple:

eval("test('woohoo')");

Maintenant, je comprends qu'il n'y a pas de méthode eval en java mais il y a la réflexion. J'ai écrit le code suivant:

String s = "test";
Class cl = Class.forName("Main");
Method method = cl.getMethod(s, String.class);
method.invoke(null, "woohoo");

Cela fonctionne parfaitement (bien sûr, il y a un bloc try, catch autour de ce code). Il exécute la méthode test. Cependant, je veux appeler plusieurs méthodes qui ont toutes des paramètres différents.

Je ne sais pas quels sont ces paramètres (donc pas seulement String.class). Mais comment est-ce possible ? Comment puis-je obtenir les types de paramètres d'une méthode ? Je connais la méthode suivante:

Class[] parameterTypes = method.getParameterTypes();

Mais cela renverra les types de paramètres de la méthode que je viens de sélectionner! avec l'instruction suivante:

Method method = cl.getMethod(s, String.class);

Toute aide serait appréciée !

15voto

cletus Points 276888

Vous devrez appeler [Class.getMethods()](http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getMethods()) et itérer à travers eux en recherchant la fonction correcte.

For (Method method : clazz.getMethods()) {
  if (method.getName().equals("...")) {
    ...
  }
}

La raison de cela est qu'il peut y avoir plusieurs méthodes avec le même nom et différents types de paramètres (c'est-à-dire que le nom de la méthode est surchargé).

getMethods() retourne toutes les méthodes publiques de la classe, y compris celles des superclasses. Une alternative est [Class.getDeclaredMethods()](http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getDeclaredMethods()), qui retourne uniquement toutes les méthodes dans cette classe.

5voto

Bozho Points 273663

Vous pouvez parcourir toutes les méthodes d'une classe en utilisant:

cls.getMethods(); // récupère toutes les méthodes publiques (de toute la hiérarchie de classes)

ou

cls.getDeclaredMethods(); // récupère toutes les méthodes déclarées par cette classe

.

for (Method method : cls.getMethods()) {
    // effectuez vos vérifications et appels ici
}

2voto

Itay Maman Points 15470

Vous pouvez utiliser getMethods() qui renvoie un tableau de toutes les méthodes d'une classe. À l'intérieur de la boucle, vous pouvez inspecter les paramètres de chaque méthode.

for(Method m : cl.getMethods()) {
   Class[] params = m.getParameterTypes();
   ...
}

Sinon, vous pouvez utiliser getDeclaredMethods() qui vous permettra de "voir" les méthodes privées (mais pas les méthodes héritées). Notez que si vous souhaitez invoquer des méthodes privées, vous devez d'abord appliquer setAccessible(boolean flag) sur celle-ci :

for(Method m : cl.getDeclaredMethods()) {
   m.setAccessible(true);
   Class[] params = m.getParameterTypes();
   ...
}

2voto

heldopslippers Points 261

Ok merci à toutes les personnes qui ont répondu à ma question, voici la solution finale :

import java.lang.reflect.Method;
public class Main {
   public static void main(String[] args){
      String func = "test";
      Object arguments[] = {"this is ", "really cool"};
      try{
         Class cl = Class.forName("Main");
         for (Method method : cl.getMethods()){
            if(method.getName().equals(func)){
               method.invoke(null, arguments);
            }
          }
       } catch (Exception ioe){
          System.out.println(ioe);
       }
    }
  public static void test(String s, String b){
     System.out.println(s+b);
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X