我想调用的方法(我知道它是公开的,但我需要使用反射):
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的结果?
答案 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());