首页 文章

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

提问于
浏览
16

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

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

3 回答

  • 24

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

    正确,你想要的是:

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

    更多the documentation . 笔记:

    • 方法的返回值是 invoke 的返回值 .

    • invoke 的第一个参数是调用该方法的实例(因为您已经列出了实例方法,而不是静态方法;如果它是静态的,则第一个参数将是 null ) . 您没有在任何地方显示引用该实例的变量,因此我在上面将其称为 yourInstance .

  • 9

    您当前正在将 myBytes 的值传递给方法 - 就好像's the target object you'将其调用一样 . 这是回报值 .

    你要:

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

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

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

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

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

    用于调用 myMethod 的代码:

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

相关问题