Je veux découvrir à l'exécution SEULEMENT les méthodes statiques d'une classe, comment puis-je faire cela? Ou, comment différencier les méthodes statiques et non statiques.Comment puis-je vérifier si une méthode est statique en utilisant la réflexion?
Répondre
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.
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()]);
}
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());
}
Modifier la réponse: est Modifier au lieu de ModifierS -> Utiliser Modifier.isStatic (method.getModifiers()) Thx pour la réponse! – Telcontar
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. –
btw la même chose fonctionne également pour les champs, qui fournissent également une méthode getModifiers() – Gregor