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.

Steven
fuente

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.

Adeel Ansari
fuente
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)
atk
fuente
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;
    }
}
Frostman
fuente
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 .

Hari Krishna
fuente