Вызов статического метода с использованием отражения

Я хочу призвать 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.')

На примере нижепотерпит неудачу, поскольку такого метода нет.

Другие вопросы по тегам