Come posso verificare se un metodo è statico utilizzando la riflessione?


107

Voglio scoprire in fase di esecuzione SOLO i metodi statici di una classe, come posso farlo? Oppure, come distinguere tra metodi statici e non statici.

Risposte:


182

Usa 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);
}

Nota: questo metodo è effettivamente pericoloso dal punto di vista della sicurezza. Class.getMethods "ignora i controlli di SecurityManager a seconda del class loader del chiamante immediato" (vedere la sezione 6 delle linee guida per la codifica sicura di Java).

Disclaimer: non testato né compilato.

Nota Modifierdovrebbe essere usata con cura. I flag rappresentati come int non sono indipendenti dai tipi. Un errore comune è testare un flag modificatore su un tipo di oggetto di riflessione a cui non si applica. Può accadere che un flag nella stessa posizione sia impostato per denotare altre informazioni.


Modifica la risposta: è Modifier invece di ModifierS -> Usa Modifier.isStatic (method.getModifiers ()) Grazie per la risposta!
Telcontar

4
Sì, grazie. Anche se sostengo che il nome sia di cattivo design. Il modificatore non rappresenta un modificatore. Ma poi l'intera classe è un cattivo design. E probabilmente anche la riflessione.
Tom Hawtin - tackline

btw lo stesso funziona anche per Fields, che fornisce anche un metodo getModifiers ()
Gregor

14

Puoi ottenere i metodi statici come questo:

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

5

Per arricchire la risposta precedente (corretta), ecco uno snippet di codice completo che fa quello che vuoi (eccezioni ignorate):

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()]);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.