Invocar un método estático usando reflexión


198

Quiero invocar el mainmétodo que es estático. Obtuve el objeto de tipo Class, pero no puedo crear una instancia de esa clase y tampoco puedo invocar el staticmétodo main.

Respuestas:


290
// 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 sea de uso privado en getDeclaredMethod()lugar de getMethod(). Y llama setAccessible(true)al objeto del método.


49

Del Javadoc de Method.invoke ():

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

Que pasa cuando tu

Clase klass = ...;
Método m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (nulo, args)

13
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;
    }
}

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

11
A veces es mucho más fácil recorrer y encontrar el método por nombre que usar getMethod porque getMethod (o getDeclaredMethod) requiere que trabaje los tipos de parámetros con gran detalle. Solo depende de si la microeficiencia importa: la iteración de Java es muy rápida, por lo que, a menos que llame al método millones de veces en algún bucle interno, la iteración será lo suficientemente rápida
Tony Eastwood,

2
Además, en una situación más real, probablemente solo encuentre el método una vez, incluso si va a usar la reflexión para invocarlo varias veces. Por lo tanto, sobrecarga adicional al encontrarlo es irrelevante.
RenniePet

44
Sin embargo, voy a pasar un mal momento con los métodos sobrecargados.
Ulysse Mizrahi

1
@UlysseMizrahi todo depende de con qué coincida, pero sí, si está escribiendo código de biblioteca, puede ser peligroso confiar solo en el nombre. Por lo general, verifico una anotación específica o una firma de método en particular, como "método estático que toma una Cadena y devuelve una instancia de la clase", luego afirmo que solo se encuentra uno de esos métodos.
cobbzilla

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

En el ejemplo anterior, 'agregar' es un método estático que toma dos enteros como argumentos.

El siguiente fragmento se utiliza para llamar al método 'agregar' con las entradas 1 y 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Referencia enlace .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.