2008-11-13 7 views

Répondre

155

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 réellement dangereuse du point de vue de la sécurité. Class.getMethods "bypass [es] SecurityManager vérifie en fonction du chargeur de classe de l'appelant immédiat" (voir la section 6 des instructions de codage sécurisé Java). Clause de non-responsabilité: Non testé ou même compilateur.

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

+0

Modifier la réponse: est Modifier au lieu de ModifierS -> Utiliser Modifier.isStatic (method.getModifiers()) Thx pour la réponse! – Telcontar

+4

Ouais, merci. Bien que je prétende que le nom est une mauvaise conception. Le modificateur ne représente pas un modificateur. Mais alors toute la classe est une mauvaise conception. Et probablement la réflexion aussi. –

+0

btw la même chose fonctionne également pour les champs, qui fournissent également une méthode getModifiers() – Gregor

6

Pour étoffer la précédente (correcte) réponse, 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()]); 
} 
13

Vous pouvez obtenir les méthodes statiques comme celui-ci:

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