2010-03-18 17 views

Respuesta

213
// String.class here is the parameter type, that might not be the case with you 
Method method = clazz.getMethod("methodName", String.class); 
Object o = method.invoke(null, "whatever"); 

En caso de que el método es el uso privado getDeclaredMethod() en lugar de getMethod(). Y llame al setAccessible(true) en el objeto de método.

9
String methodName= "..."; 
String[] args = {}; 

Method[] methods = clazz.getMethods(); 
for (Method m : methods) { 
    if (methodName.equals(m.getName())) { 
     // for static methods we can use null as instance of class 
     m.invoke(null, new Object[] {args}); 
     break; 
    } 
} 
+10

¿Por qué no utilizar getMethod con el nombre correcto en lugar de recorrer todos los métodos? – mjaggard

+9

A veces es mucho más fácil hacer bucles y encontrar el método por nombre que usar getMethod porque getMethod (u getDeclaredMethod) requiere que resuelvas los tipos de parámetros con gran detalle. Simplemente depende de si la microeficiencia es importante: la iteración de Java es muy rápida, así que a menos que llame al método millones de veces en algún ciclo interno, la iteración será lo suficientemente rápida –

+2

También en una situación más real probablemente solo encuentre el método una vez, incluso si va a utilizar la reflexión para invocarlo varias veces. Por lo tanto, extra sobrecarga al encontrarlo es inmaterial. – RenniePet

34

fromthe Javadoc de Method.invoke():

Si el método subyacente es estático, entonces el argumento obj especificado se ignora. Puede ser nulo.

¿Qué pasa cuando

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args) 
Cuestiones relacionadas