Invoquer une méthode statique utilisant la réflexion


198

Je veux invoquer la mainméthode 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 je ne peux pas non plus invoquer la staticméthode main.

Réponses:


290
// 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 à usage privé getDeclaredMethod()au lieu de getMethod(). Et appelez setAccessible(true)l'objet méthode.


49

Du Javadoc de Method.invoke ():

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

Que se passe-t-il lorsque vous

Classe klass = ...;
Méthode m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

13
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;
    }
}

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

11
Parfois, il est beaucoup plus facile de boucler et de trouver la méthode par son nom que d'utiliser getMethod car getMethod (ou getDeclaredMethod) nécessite que vous travailliez en détail les types de paramètres. Tout dépend de la micro-efficacité - 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
Tony Eastwood

2
Dans une situation plus réelle, vous ne trouverez probablement la méthode qu'une seule 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 sont sans importance.
RenniePet

4
Je vais avoir du mal avec des méthodes surchargées.
Ulysse Mizrahi

1
@UlysseMizrahi tout dépend de ce sur quoi vous correspondez, mais oui, si vous écrivez du code de bibliothèque, il peut être dangereux de se fier uniquement au nom. Je vérifie généralement une annotation spécifique ou une signature de méthode particulière, comme "méthode statique qui prend une chaîne et renvoie une instance de la classe", puis j'affirme qu'il n'y a qu'une seule de ces méthodes trouvée.
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

Dans l'exemple ci-dessus, 'add' est une méthode statique qui prend deux entiers comme arguments.

L'extrait suivant est utilisé pour appeler la méthode 'add' avec les entrées 1 et 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Lien de référence .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.