23

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

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 的调用结果?

4

3 回答 3

33

没有抛出异常,但 myBytes 保持为空

正确,你想要的是:

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

更多在文档中。笔记:

  • 方法的返回值是 的返回值invoke
  • 的第一个参数invoke是调用该方法的实例(因为您列出了一个实例方法,而不是静态方法;如果它是静态的,第一个参数将是null)。您没有在任何地方显示引用实例的变量,所以我yourInstance在上面调用了它。
于 2013-01-21T17:16:56.880 回答
13

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

你要:

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

target您要调用它的实例在哪里(因为它是实例方法)。

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

byte[] myBytes = (byte[]) m.invoke(null);
于 2013-01-21T17:17:29.887 回答
0

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

要调用的代码myMethod

byte[] returnVal = (byte[]) m.invoke(MyClass.newInstance());
于 2014-11-30T16:39:02.570 回答