API отражения Java: вызов метода без параметров
Метод, который я хочу вызвать (я знаю это публично, но мне нужно использовать отражение):
public byte[] myMethod()
Я получаю объект Method
, подобный этому, и m
содержит myMethod()
(я проверил с отладчиком)
Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");
Наконец, мне нужно вызвать m и передать результат объекту:
byte[] myBytes = null;
m.invoke(myBytes);
Никакое исключение не выбрасывается, но myBytes
остается null... Я также пробовал следующее без больших успехов:
m.invoke(myBytes, (Object[])null);
Как я могу получить результат вызова в myBytes?
Ответы
Ответ 1
Исключение не выбрано, но myBytes остается нулевым
Правильно, что вы хотели:
byte[] myBytes = (byte[])m.invoke(yourInstance);
Подробнее в документации. Примечания:
- Возвращаемое значение метода - это возвращаемое значение
invoke
.
- Первый аргумент
invoke
- это экземпляр вызова метода (поскольку вы указали метод экземпляра, а не статический метод, если он был статическим, первым аргументом будет null
). Вы не указали переменную, ссылающуюся на экземпляр в любом месте, поэтому я назвал его yourInstance
в приведенном выше.
Ответ 2
В настоящее время вы передаете значение myBytes
в метод - как если бы это был целевой объект, на который вы его вызывали. Это возвращаемое значение.
Вы хотите:
byte[] myBytes = (byte[]) m.invoke(target);
где target
- это экземпляр, на который вы хотите называть его (как метод экземпляра).
Если у вас нет экземпляра, метод должен быть статическим методом, после чего вы должны изменить вызов:
byte[] myBytes = (byte[]) m.invoke(null);
Ответ 3
invoke
метод принимает первый аргумент как экземпляр объекта для метода, за которым следуют параметры.
Здесь подпись метода public byte[] myMethod()
Код для вызова myMethod
:
byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());