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());