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

2 minutos de lectura

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

quiero invocar a main método que es estático. Tengo el objeto de tipo Class, pero no puedo crear una instancia de esa clase y tampoco puedo invocar el static método main.

// 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 getDeclaredMethod() en vez de getMethod(). Y llama setAccessible(true) en el objeto del método.

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

Del Javadoc de Method.invoke():

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

¿Qué pasa cuando tú

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

  • ¿Qué sucede si m es un método que recibe un método o una interfaz invocable como parámetro?

    – linjiejun

    24 oct.

Invocar un método estático usando la reflexión
hombre de escarcha

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

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

    – mjaggard

    17 abr.

  • A veces es mucho más fácil hacer un bucle y encontrar el método por su nombre que usar getMethod porque getMethod (o getDeclaredMethod) requiere que resuelva los tipos de parámetros con gran detalle. Solo depende de si la eficiencia micro es importante: 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 ciclo interno, la iteración será lo suficientemente rápida

    –Tony Eastwood

    16 sep.


  • 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. Entonces, los gastos generales adicionales al encontrarlo son irrelevantes.

    – RenniePet

    30 nov.

  • Sin embargo, lo pasaré mal con métodos sobrecargados.

    – Ulises Mizrahi

    28 sep.

  • @UlysseMizrahi, todo depende de lo que coincida, pero sí, si está escribiendo código de biblioteca, puede ser peligroso confiar solo en el nombre. Por lo general, busco una anotación específica, o una firma de método particular, como “método estático que toma una cadena y devuelve una instancia de la clase”, luego afirmo que solo se encontró uno de esos métodos.

    – cobbzilla

    16 abr.


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 números enteros como argumentos.

El siguiente fragmento se usa para llamar al método ‘agregar’ con la entrada 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.

.

¿Ha sido útil esta solución?