¿Cómo puedo comprobar si un método es estático mediante reflexión?

107

Quiero descubrir en tiempo de ejecución SOLAMENTE los métodos estáticos de una clase, ¿cómo puedo hacer esto? O cómo diferenciar entre métodos estáticos y no estáticos.

Telcontar
fuente

Respuestas:

182

Utilice 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 es realmente peligroso desde el punto de vista de la seguridad. Class.getMethods "omite las comprobaciones de SecurityManager en función del cargador de clases del llamador inmediato" (consulte la sección 6 de las directrices de codificación segura de Java).

Descargo de responsabilidad: no probado ni compilado.

La nota Modifierdebe usarse con cuidado. Las banderas representadas como ints no son seguras para los tipos. Un error común es probar una marca modificadora en un tipo de objeto de reflexión al que no se aplica. Puede darse el caso de que se establezca una bandera en la misma posición para indicar otra información.

Tom Hawtin - tackline
fuente
Edite la respuesta: es Modifier en lugar de ModifierS -> Use Modifier.isStatic (method.getModifiers ()) ¡Thx para la respuesta!
Telcontar
4
Sí, gracias. Aunque afirmo que el nombre es un error de diseño. El modificador no representa un modificador. Pero entonces toda la clase es un mal diseño. Y probablemente también la reflexión.
Tom Hawtin - tackline
por cierto, lo mismo también funciona para Fields, que también proporciona un método getModifiers ()
Gregor
14

Puede obtener los 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
fuente
5

Para desarrollar la respuesta anterior (correcta), aquí hay un fragmento de código completo que hace lo que usted quiere (excepciones 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
fuente