2010-06-16 9 views
21

J'ai un tableau de chaînes qui contient les noms de méthode dans la classe yyyyyyfonction Java dynamique appelant

Dans la classe xxxxxx je fais une instance yyyyyy (par exemple obj). Maintenant, je peux appeler obj.function_name(), sauf que je veux lire function_name à partir du tableau String dans une boucle. Est-ce possible?

+1

Pouvez-vous préciser? Ce n'est pas si clair à comprendre. –

+3

Je crois que le terme que vous recherchez est "réflexion". – Stephen

+0

et je suis également sûr de ce qu'il voulait dire est celui-ci: http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name -as-a-string – gumuruh

Répondre

32

Vous pouvez, à l'aide reflection. Il est fait en appelant Yyyy.class.getMethod("methodName").invoke(someArgs)

Vous devrez gérer un tas d'exceptions, et votre méthode doit être public. Notez que les conventions de codage Java préfèrent methodName à method_name. Cependant, l'utilisation de la réflexion devrait être un dernier recours. Vous devriez utiliser plus de techniques orientées objet.

Si vous avez besoin en permanence des fonctionnalités similaires, peut-être vous pouvez regarder un langage dynamique en cours d'exécution sur la plate-forme Java, comme groovy

22

Il est possible d'utiliser la réflexion, bien que vous deviez probablement remettre en question votre conception si vous avez besoin de ce genre de comportement. Class.getMethod prend un String pour le nom de la méthode et retourne un objet Method, que vous pouvez ensuite appeler .invoke à appeler la méthode

Ces pages Javadoc devraient être utiles:

Exemple de code (en supposant que les méthodes yyyyyy prennent un argument int, juste pour montrer l'argument pa ssing):

yyyyyy obj = new yyyyyy(); 
String[] methodNames = {"foo", "bar", "baz"}; 
for(String methodName : methodNames) { 
    Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class}); 
    method.invoke(obj, 4); // 4 is the argument to pass to the method 
} 
+1

Pourquoi n'utilisez-vous pas 'obj.getClass()' à la place de 'Class.forName ("yyyyyy") '? – Marc

+0

liens sont foirés, essayez de remplacer (avec% 28 et) avec% 29 –

+1

@Marc Je préfère réellement yyyyyy.class sur l'un ou l'autre, mais aucun travail –