使用反射在字段上调用方法

12

我的代码看起来像下面这样:

class MyObject {

    MyField f = new MyField();

}

class MyField {
    public void greatMethod();
}
有没有一种方法可以使用反射在MyObject类的对象上调用greatMethod()
我尝试了以下方法:
Field f = myObject.getClass().getDeclaredField("f");
Method myMethod = f.getDeclaringClass().getDeclaredMethod("greatMethod", new Class[]{});
myMethod.invoke(f);

但实际上它正在尝试直接在我的 myObject 上调用 greatMethod() 而不是在其中的字段 f 上调用。有没有一种方法可以实现这个目标,而无需修改 MyObject 类(使其实现一个调用 f 上适当方法的方法)。


通过调用getDeclaringClass方法,您可以获取MyObject类,因此很清楚为什么它在MyObject中搜索该方法。 - mschenk74
1个回答

26
你已经接近了正确的答案,只需要获取声明的方法并在包含在你对象实例中的字段实例上调用它,而不是在字段上调用,就像下面这样:

你已经很接近了,只需要获取声明的方法并在包含在你对象实例中的字段实例上调用它,而不是在字段上调用,像下面这样:

    // obtain an object instance
    MyObject myObjectInstance =  new MyObject();

    // get the field definition
    Field fieldDefinition = myObjectInstance.getClass().getDeclaredField("f");

    // make it accessible
    fieldDefinition.setAccessible(true);

    // obtain the field value from the object instance
    Object fieldValue = fieldDefinition.get(myObjectInstance);

    // get declared method
    Method myMethod =fieldValue.getClass().getDeclaredMethod("greatMethod", new Class[]{});

    // invoke method on the instance of the field from yor object instance
    myMethod.invoke(fieldValue);

抱歉,我的错误。在获取其值之前,应该先使该字段可访问,请查看更新的回复。 - Morfic
没问题,很高兴能帮助到您。 - Morfic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接