Wie kann ich mithilfe von Reflexion überprüfen, ob eine Methode statisch ist?

106

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

Telcontar
quelle

Antworten:

181

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 "Bypass [es] SecurityManager-Überprüfungen in Abhängigkeit vom Klassenladeprogramm des unmittelbaren Aufrufers" (siehe Abschnitt 6 der Richtlinien für die sichere Java-Codierung).

Haftungsausschluss: Nicht getestet oder sogar kompiliert.

Hinweis Modifiersollte mit Vorsicht verwendet werden. Als Ints dargestellte Flags sind nicht typsicher. Ein häufiger Fehler besteht darin, ein Modifikatorflag 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 wird, um andere Informationen anzuzeigen.

Tom Hawtin - Tackline
quelle
Bearbeiten Sie die Antwort: ist Modifier anstelle von ModifierS -> Verwenden Sie Modifier.isStatic (method.getModifiers ()) Thx für die Antwort!
Telcontar
4
Ja, danke. Obwohl ich behaupte, der Name sei ein falsches Design. Der Modifikator repräsentiert keinen Modifikator. Aber dann ist die ganze Klasse ein falsches Design. Und wahrscheinlich auch Reflexion.
Tom Hawtin - Tackline
Übrigens funktioniert das auch für Felder, die auch eine Methode getModifiers ()
Gregor
14

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

Um die vorherige (richtige) Antwort zu präzisieren, finden Sie hier ein vollständiges Code-Snippet, das das tut, was Sie wollen (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()]);
}
Daniel Spiewak
quelle