Java反射API:调用不带参数的方法

时间:2013-01-21 17:14:17

标签: java reflection

我想调用的方法(我知道它是公开的,但我需要使用反射):

public byte[] myMethod()  

我得到Method这样的对象,而m包含myMethod()(我使用调试器检查过)

Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");

最后,我需要调用m并将结果传递给对象:

byte[] myBytes = null;
m.invoke(myBytes);

没有抛出异常,但myBytes保持为空...我还尝试了以下内容而没有取得更多成功:

m.invoke(myBytes, (Object[])null);

如何获取调用myBytes的结果?

3 个答案:

答案 0 :(得分:26)

  

不会抛出任何异常,但myBytes保持为空

正确,你想要的是:

byte[] myBytes = (byte[])m.invoke(yourInstance);

the documentation中的更多信息。注意:

  • 方法的返回值是invoke的返回值。
  • invoke的第一个参数是调用方法的实例(因为你列出了一个实例方法,而不是一个静态方法;如果它是静态的,那么第一个参数将是{{1} })。您没有在任何地方显示引用该实例的变量,因此我在上面将其称为null

答案 1 :(得分:9)

您当前正在将myBytes 的值传递给方法 - 就好像它是您要调用它的目标对象一样。这是 return 值。

你想:

byte[] myBytes = (byte[]) m.invoke(target);

其中target是您要调用它的实例(因为它是一个实例方法)。

如果您没有实例,则该方法必须是静态方法,此时您将调用更改为:

byte[] myBytes = (byte[]) m.invoke(null);

答案 2 :(得分:0)

invoke方法将第一个参数作为参数后跟的方法的实例对象。 方法签名为public byte[] myMethod()

调用myMethod的代码:

byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());