调用类中定义的私有对象的方法(Java反射)

时间:2014-01-08 13:59:27

标签: java reflection

我有一个班级:

public class MyClass {

  private final AnotherClass myField = new AnotherClass() {
       @Override
       public long getSize() { 
            ...
       }
}

我已经获得了Class的{​​{1}}对象:

MyClass

如何使用 Java反射来调用Class<MyClass> myClazz = LOAD_CLASS("MyClass"); 中定义的getSize() myField方法?

2 个答案:

答案 0 :(得分:1)

您必须使用Field#setAccessible(boolean b)方法才能访问私有字段。

你可以这样做:

MyClass obj = new MyClass();
try {
    Field field = obj.getClass().getDeclaredField("myField");
    field.setAccessible(true);
    AnotherClass privateField = (AnotherClass) field.get(obj);
    long size = privateField.getSize(); //invoke the getSize() method
    field.setAccessible(false);
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

答案 1 :(得分:1)

您需要在getDeclaredMethod对象上使用myField

Field field = obj.getClass().getDeclaredField("myField");
field.setAccessible(true);

Object privateField = field.get(obj);

Method getSizeMethod = privateField.getClass().getDeclaredMethod("getSize");

Long result = (Long)getSizeMethod.invoke(privateField);