使用反射来调用字段上的方法

时间:2014-04-08 06:42:39

标签: java reflection methods invoke

我的代码如下所示:

class MyObject {

    MyField f = new MyField();

}

class MyField {
    public void greatMethod();
}

有没有办法使用对greatMethod()类对象的反射来调用MyObject

我尝试了以下内容:

Field f = myObject.getClass().getDeclaredField("f");
Method myMethod = f.getDeclaringClass().getDeclaredMethod("greatMethod", new Class[]{});
myMethod.invoke(f);

但是它试图直接在我的myObject上调用greatMethod()而不是在其中的字段f上调用{{1}}。有没有办法实现这一点而无需修改MyObject类(因此它将实现一个在f上调用适当方法的方法)。

1 个答案:

答案 0 :(得分:18)

你很亲密,你只需要获取声明的方法并在对象实例中包含的字段实例上调用它,而不是在字段上调用它,如下所示

    // 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);