Como posso verificar se um método é estático usando reflexão?

107

Eu quero descobrir em tempo de execução SOMENTE os métodos estáticos de uma classe, como posso fazer isso? Ou como diferenciar entre métodos estáticos e não estáticos.

Telcontar
fonte

Respostas:

182

Use 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: Este método é realmente perigoso do ponto de vista de segurança. Class.getMethods "bypass [es] SecurityManager verifica dependendo do carregador de classe do chamador imediato" (consulte a seção 6 das diretrizes de codificação segura Java).

Isenção de responsabilidade: não testado ou mesmo compilado.

Nota Modifierdeve ser usada com cuidado. Sinalizadores representados como ints não são seguros para o tipo. Um erro comum é testar um sinalizador de modificador em um tipo de objeto de reflexão ao qual ele não se aplica. Pode ser que um sinalizador na mesma posição seja definido para denotar alguma outra informação.

Tom Hawtin - tackline
fonte
Edite a resposta: é Modifier em vez de ModifierS -> Use Modifier.isStatic (method.getModifiers ()) Thx para a resposta!
Telcontar
4
Sim, obrigado. Embora eu afirme que o nome é um projeto incorreto. O modificador não representa um modificador. Mas então toda a classe é um projeto errado. E provavelmente reflexão também.
Tom Hawtin - tackline
btw o mesmo também funciona para Fields, que também fornece um método getModifiers ()
Gregor
14

Você pode obter os métodos estáticos como este:

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

Para completar a resposta anterior (correta), aqui está um trecho de código completo que faz o que você deseja (exceções ignoradas):

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
fonte