Quiero descubrir en el tiempo de ejecución SÓLO 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.¿Cómo puedo verificar si un método es estático utilizando la reflexión?
Respuesta
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 es realmente peligroso desde el punto de vista de la seguridad. Class.getMethods "bypass [es] SecurityManager comprueba en función del cargador de clases del llamante inmediato" (consulte la sección 6 de las pautas de codificación segura de Java).
Descargo de responsabilidad: No se ha probado o compilador.
Nota Modifier
se debe utilizar con cuidado. Los indicadores representados como ints no son seguros. Un error común es probar un indicador de modificador en un tipo de objeto de reflexión al que no se aplica. Puede ser que una bandera en la misma posición esté configurada para indicar otra información.
para dar cuerpo a la respuesta anterior (correcto), aquí es un fragmento de código completo, que hace lo que 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()]);
}
Usted 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());
}
- 1. Invocación de un método estático utilizando la reflexión
- 2. ¿Cómo comprobar si un método es estático en PHP?
- 3. ¿Cómo puedo verificar si un identificador de MATLAB es válido?
- 4. Determine si un tipo es estático
- 5. ¿Cómo puedo verificar si un valor es un número?
- 6. PowerMock, mockito, verificar el método estático
- 7. ¿Cómo puedo llamar a un método no estático desde un método estático en C#?
- 8. ¿Cómo crear objetos utilizando un método de fábrica estático?
- 9. ¿Cómo puedo verificar si un entero con signo es positivo?
- 10. ¿Cómo puedo verificar si un gráfico dirigido es acíclico?
- 11. Cómo determinar por reflexión si un Método devuelve 'nulo'
- 12. detectar si un método fue anulada mediante la reflexión (C#)
- 13. En Java, ¿cómo usar la reflexión para obtener un método estático y ejecutarlo?
- 14. ¿Cómo puedo simplificar la invocación del método de extensión Linq utilizando la reflexión?
- 15. ¿Cómo puedo verificar si la función es parcial?
- 16. ¿cómo puedo verificar si existe un archivo?
- 17. Llamar a un método estático utilizando un tipo
- 18. ¿Cómo puedo verificar si existe un directorio?
- 19. Compruebe si la clase tiene el método estático
- 20. ¿Por qué puedo llamar a Form.Close() si no es un método estático
- 21. ¿Cómo puedo simular fácilmente un método estático en Java (jUnit4)
- 22. ¿Cómo ejecutar un método estático privado con parámetros opcionales a través de la reflexión?
- 23. ¿Puedo crear una nueva función utilizando la reflexión en Go?
- 24. ¿Qué es un "método estático" en C#?
- 25. Cómo encontrar un método sobrecargado por reflexión
- 26. Bloquear() en un método estático
- 27. ¿Cómo invoco un método estático privado usando reflection (Java)?
- 28. ¿Por qué no puedo verificar si un 'DateTime' es 'Nothing'?
- 29. ¿Cómo invocar un método que arroja una excepción utilizando la reflexión de Java?
- 30. C# ¿Cómo puedo verificar si existe una URL/es válida?
Edite la respuesta: es Modificador en lugar de Modificadores -> Use Modifier.isStatic (method.getModifiers()) Thx for the Answer! – Telcontar
Sí, gracias. Aunque afirmo que el nombre es un mal diseño. El modificador no representa un modificador. Pero luego toda la clase es un mal diseño. Y probablemente también reflexión. –
por cierto, lo mismo también funciona para Fields, que también proporciona un método getModifiers() – Gregor