it-swarm.com.de

Wie kann ich mithilfe der Reflexion prüfen, ob eine Methode statisch ist?

Ich möchte NUR zur Laufzeit die statischen Methoden einer Klasse kennenlernen. Wie kann ich das tun? Oder wie man zwischen statischen und nicht statischen Methoden unterscheidet.

101
Telcontar

Verwenden Sie 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);
}

Hinweis: Diese Methode ist aus Sicherheitsgründen tatsächlich gefährlich. Class.getMethods "umgeht [es] SecurityManager prüft abhängig vom Klassenladeprogramm des unmittelbaren Aufrufers" (siehe Abschnitt 6 der Java Richtlinien zur sicheren Codierung).

Haftungsausschluss: Nicht getestet oder gar kompiliert.

Hinweis Modifier sollte mit Vorsicht verwendet werden. Flags, die als Ints dargestellt werden, sind nicht typsicher. Ein häufiger Fehler besteht darin, ein Modifikator-Flag für einen Typ von Reflexionsobjekt zu testen, für den es nicht gilt. Es kann der Fall sein, dass ein Flag an derselben Position gesetzt ist, um andere Informationen anzuzeigen.

176

Sie können die statischen Methoden wie folgt erhalten:

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

Um die vorherige (richtige) Antwort zu vervollständigen, finden Sie hier einen vollständigen Codeausschnitt, der genau das tut, was Sie möchten (Ausnahmen werden ignoriert):

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