2010-03-18 6 views
150

Je souhaite appeler la méthode main qui est statique. J'ai obtenu l'objet de type Class, mais je ne suis pas en mesure de créer une instance de cette classe et également pas en mesure d'invoquer la méthode staticmain.Appel d'une méthode statique à l'aide de la réflexion

+3

nous dans le code, s'il vous plaît. –

Répondre

213
// String.class here is the parameter type, that might not be the case with you 
Method method = clazz.getMethod("methodName", String.class); 
Object o = method.invoke(null, "whatever"); 

Dans le cas où la méthode est l'utilisation privée getDeclaredMethod() au lieu de getMethod(). Et appelez setAccessible(true) sur l'objet méthode.

9
String methodName= "..."; 
String[] args = {}; 

Method[] methods = clazz.getMethods(); 
for (Method m : methods) { 
    if (methodName.equals(m.getName())) { 
     // for static methods we can use null as instance of class 
     m.invoke(null, new Object[] {args}); 
     break; 
    } 
} 
+10

Pourquoi ne pas utiliser getMethod avec le nom correct au lieu de boucler toutes les méthodes? – mjaggard

+9

Parfois, il est beaucoup plus facile de faire une boucle et de trouver la méthode par son nom que d'utiliser getMethod car getMethod (ou getDeclaredMethod) nécessite que vous développiez les types de paramètres dans les moindres détails. Cela dépend si la micro-efficacité est importante - l'itération Java est très rapide, donc à moins que vous n'appeliez la méthode des millions de fois dans une boucle interne, l'itération sera assez rapide –

+2

Dans une situation plus réelle, vous ne trouverez probablement que la méthode une fois même si vous allez utiliser la réflexion pour l'invoquer plusieurs fois. Donc, les frais généraux supplémentaires lorsque vous le trouvez est sans importance. – RenniePet

34

lesemployés Javadoc de Method.invoke():

Si la méthode sous-jacente est statique, l'argument obj spécifié est ignoré. Cela peut être nul.

Qu'est-ce qui se passe quand vous

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args) 
Questions connexes