2008-11-13 14 views

Odpowiedz

155

Użyj 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); 
} 

Uwaga: Ta metoda jest rzeczywiście niebezpieczna z punktu widzenia bezpieczeństwa. Class.getMethods "pomija [es] menedżer SecurityManager sprawdza w zależności od modułu ładującego klasę rozmówcy" (patrz sekcja 6 wytycznych bezpiecznego kodowania Java).

Nota prawna: Nie testowano, a nawet kompilator.

Należy zachować ostrożność przy notowaniu Modifier. Flagi oznaczone jako int nie są bezpieczne. Typowym błędem jest przetestowanie flagi modyfikatora na typie obiektu odbicia, do którego nie ma zastosowania. Może się zdarzyć, że flaga w tej samej pozycji jest ustawiona na oznaczenie innych informacji.

+0

Edytuj odpowiedź: jest modyfikatorem zamiast modyfikatorów -> Użyj Modifier.isStatic (method.getModifiers()) Thx za odpowiedź! – Telcontar

+4

Yup, dzięki. Chociaż twierdzę, że nazwa to misdesign. Modyfikator nie reprezentuje modyfikatora. Ale cała klasa jest błędnym projektem. I prawdopodobnie także refleksja. –

+0

btw to samo działa również dla pól, które również zapewniają metodę getModifiers() – Gregor

6

Aby ucieleśnić poprzedni (poprawnie) odpowiedź, tutaj jest pełna fragment kodu, który robi to, co chcesz (wyjątki ignorowane):

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

można uzyskać statyczne metody tak:

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