Comment puis-je vérifier si une méthode est statique en utilisant la réflexion?


107

Je souhaite découvrir au moment de l'exécution UNIQUEMENT les méthodes statiques d'une classe, comment puis-je faire cela? Ou, comment faire la différence entre les méthodes statiques et non statiques.

Réponses:


182

Utilisez Modifier.isStatic(method.getModifiers()).

/**
 * Returns the public static methods of a class or interface,
 *   including those declared in super classes and interfaces.
 */
public static List<Method> getStaticMethods(Class<?> clazz) {
    List<Method> methods = new ArrayList<Method>();
    for (Method method : clazz.getMethods()) {
        if (Modifier.isStatic(method.getModifiers())) {
            methods.add(method);
        }
    }
    return Collections.unmodifiableList(methods);
}

Remarque: cette méthode est en fait dangereuse du point de vue de la sécurité. Class.getMethods "contourner [es] les vérifications de SecurityManager en fonction du chargeur de classe de l'appelant immédiat" (voir la section 6 des directives de codage sécurisé Java).

Avertissement: non testé ni même compilé.

La note Modifierdoit être utilisée avec précaution. Les indicateurs représentés par des entiers ne sont pas de type sûr. Une erreur courante consiste à tester un indicateur de modificateur sur un type d'objet de réflexion auquel il ne s'applique pas. Il se peut qu'un drapeau à la même position soit positionné pour indiquer d'autres informations.


Modifiez la réponse: est un modificateur au lieu de ModifierS -> Utilisez Modifier.isStatic (method.getModifiers ()) Thx pour la réponse!
Telcontar

4
Oui, merci. Bien que je prétende que le nom est une erreur. Le modificateur ne représente pas un modificateur. Mais alors toute la classe est une mauvaise conception. Et probablement une réflexion aussi.
Tom Hawtin - tackline

btw la même chose fonctionne également pour Fields, qui fournit également une méthode getModifiers ()
Gregor

14

Vous pouvez obtenir les méthodes statiques comme ceci:

for (Method m : MyClass.class.getMethods()) {
   if (Modifier.isStatic(m.getModifiers()))
      System.out.println("Static Method: " + m.getName());
}

5

Pour étoffer la réponse précédente (correcte), voici un extrait de code complet qui fait ce que vous voulez (exceptions ignorées):

public Method[] getStatics(Class<?> c) {
    Method[] all = c.getDeclaredMethods()
    List<Method> back = new ArrayList<Method>();

    for (Method m : all) {
        if (Modifier.isStatic(m.getModifiers())) {
            back.add(m);
        }
    }

    return back.toArray(new Method[back.size()]);
}
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.