Викликати статичний метод за допомогою рефлексії


199

Я хочу використати mainметод, який є статичним. Я отримав об'єкт типу Class, але я не в змозі створити екземпляр цього класу, а також не в змозі викликати staticметод main.

Відповіді:


291
// 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)об’єкт методу.


49

Від Javadoc з Method.invoke ():

Якщо базовий метод є статичним, то вказаний аргумент obj ігнорується. Це може бути недійсним.

Що відбувається, коли ти

Клас класу = ...;
Метод m = klass.getDeclaredMethod (methodName, парамтипи);
m.invoke (null, args)

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

11
Чому б не використовувати getMethod з правильним іменем замість того, щоб переглядати всі методи?
mjaggard

11
Іноді набагато простіше знайти цикл і знайти метод за назвою, ніж використовувати getMethod, тому що getMethod (або getDeclaredMethod) вимагає детально опрацювати типи параметрів. Це просто залежить, якщо важлива мікроефективність - ітерація Java дуже швидка, тому якщо ви не зателефонуєте методу мільйони разів у якийсь внутрішній цикл, тоді ітерація буде досить швидкою
Тоні Іствуд

2
Також у більш реальній ситуації ви, ймовірно, знайдете метод лише один раз, навіть якщо ви збираєтесь використовувати роздуми, щоб викликати його кілька разів. Тож додаткові накладні витрати, коли виявляють, що це несуттєво.
RenniePet

4
Хоча не встигати з перевантаженими методами.
Ulysse Mizrahi

1
@UlysseMizrahi все залежить від того, на що ти відповідаєш, але так, якщо ти пишеш код бібліотеки, покладатися на ім’я може бути небезпечно. Я зазвичай перевіряю наявність конкретної анотації або певного методу підпису, як-от "статичний метод, який бере String і повертає екземпляр класу", а потім запевняю, що знайдено лише один такий метод.
cobbzilla

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

У наведеному вище прикладі "add" - це статичний метод, який бере два аргументи як цілі числа.

Наступний фрагмент використовується для виклику методу "додати" із введеннями 1 та 2.

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

Посилання на посилання .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.