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.

Telcontar
la source

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.

Tom Hawtin - Tacle
la source
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());
}
bruno conde
la source
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()]);
}
Daniel Spiewak
la source