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


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.