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

zna*_*nat 17 java reflection

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

public byte[] myMethod()  
Run Code Online (Sandbox Code Playgroud)

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

Method m = Class.forName(MyClass.class.getName()).getDeclaredMethod("myMethod");
Run Code Online (Sandbox Code Playgroud)

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

byte[] myBytes = null;
m.invoke(myBytes);
Run Code Online (Sandbox Code Playgroud)

没有抛出异常但myBytes保持为null ...我也尝试了以下方法但没有取得更多成功:

m.invoke(myBytes, (Object[])null);
Run Code Online (Sandbox Code Playgroud)

如何获得调用myBytes的结果?

T.J*_*der 27

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

正确,你想要的是:

byte[] myBytes = (byte[])m.invoke(yourInstance);
Run Code Online (Sandbox Code Playgroud)

更多文档.笔记:

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


Jon*_*eet 12

您目前正在传递的价值myBytes 方法-因为它是你会在调用它的目标对象.这是回报值.

你要:

byte[] myBytes = (byte[]) m.invoke(target);
Run Code Online (Sandbox Code Playgroud)

target你要调用它的实例在哪里(因为它是一个实例方法).

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

byte[] myBytes = (byte[]) m.invoke(null);
Run Code Online (Sandbox Code Playgroud)