web-dev-qa-db-fra.com

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

Je veux découvrir au moment de l'exécution UNIQUEMENT les méthodes statiques d'une classe, comment faire? Ou, comment différencier les méthodes statiques et non statiques.

101
Telcontar

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 "contourne [es] les contrôles de SecurityManager en fonction du chargeur de classe de l'appelant immédiat" (voir la section 6 des Java directives de codage sécurisé).

Avertissement: Non testé ou même compilé.

Remarque Modifier doit être utilisé avec précaution. Les drapeaux représentés comme des entiers ne sont pas de type sécurisé. Une erreur courante consiste à tester un indicateur de modification sur un type d'objet de réflexion auquel il ne s'applique pas. Il peut arriver qu'un indicateur dans la même position soit défini pour indiquer d'autres informations.

176

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());
}
13
bruno conde

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()]);
}
5
Daniel Spiewak