开发者

Invoking a static method using reflection

开发者 https://www.devze.com 2022-12-24 09:20 出处:网络
I want to invoke the main method which is static. I got the object of type Class, but I am not able to create an instance of th开发者_开发问答at class and also not able to invoke the static method mai

I want to invoke the main method which is static. I got the object of type Class, but I am not able to create an instance of th开发者_开发问答at class and also not able to invoke the static method 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");

In case the method is private use getDeclaredMethod() instead of getMethod(). And call setAccessible(true) on the method object.


Fromthe Javadoc of Method.invoke():

If the underlying method is static, then the specified obj argument is ignored. It may be null.

What happens when you

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


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


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

In the above example, 'add' is a static method that takes two integers as arguments.

Following snippet is used to call 'add' method with input 1 and 2.

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

Reference link.


Please keep in mind, that you have to also provide argument types, when trying to get desired method.

Below an example written using Groovy.

import groovy.transform.CompileStatic
import org.springframework.util.ReflectionUtils

import java.lang.reflect.Method

@CompileStatic
class Fun {

    final static String funText() {
        return 'Have fun now!'
    }

    final static String myText(String text) {
        return text
    }

}

Method m1 = ReflectionUtils.findMethod(Fun, 'funText')
println m1.invoke(null)

Method m2 = ReflectionUtils.findMethod(Fun, 'myText', String)
println m2.invoke(null, 'Some text.')

Method m3 = ReflectionUtils.findMethod(Fun, 'myText')
println m3.invoke(null, 'Another text.')

On example below m3 will fail as there is no such method.

0

精彩评论

暂无评论...
验证码 换一张
取 消