Вызов статического метода с использованием отражения
Я хочу призвать main
метод, который является статическим. Я получил объект типа Class
, но я не могу создать экземпляр этого класса, а также не могу вызвать static
метод main
,
5 ответов
// 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");
В случае, если метод частного использования getDeclaredMethod()
вместо getMethod()
, И позвонить setAccessible(true)
на объекте метода.
От Javadoc для Method.invoke():
Если базовый метод является статическим, то указанный аргумент obj игнорируется. Это может быть ноль.
Что происходит, когда ты
Класс класс = ...; Метод 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);
}
}
В приведенном выше примере add - это статический метод, который принимает в качестве аргументов два целых числа.
Следующий фрагмент используется для вызова метода add с входными данными 1 и 2.
Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);
Ссылка на ссылку.
Имейте в виду, что вы также должны указать типы аргументов при попытке получить желаемый метод.
Ниже приведен пример, написанный с использованием 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.')
На примере ниже