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

调用类中定义的私有对象的方法(Java反射),java,reflection,Java,Reflection,我有一门课: public class MyClass { private final AnotherClass myField = new AnotherClass() { @Override public long getSize() { ... } } 我已经得到了MyClass的Class对象: Class<MyClass> myClazz = LOAD_CLASS("MyClass"); Clas

我有一门课:

public class MyClass {

  private final AnotherClass myField = new AnotherClass() {
       @Override
       public long getSize() { 
            ...
       }
}
我已经得到了
MyClass
Class
对象:

Class<MyClass> myClazz = LOAD_CLASS("MyClass");
Class myClazz=LOAD_Class(“MyClass”);

如何使用Java反射调用
MyClass
中定义的
myField
getSize()
方法?

您必须使用
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();
}

您需要在
myField
对象上使用
getDeclaredMethod

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

请看:,但要小心。@Kevin,我不知道你的链接如何回答我的问题。我的问题不仅是如何加载字段,还包括如何调用字段的getSize()函数。它描述了如何设置字段的可访问性,这将允许您通过反射访问私有字段。@Kevin,我明白了,但我的关键问题是如何调用私有字段的函数,你的链接对此没有引用。但是我不能像你的代码那样声明另一个类类型,因为我需要在运行时加载所有内容,而不是编译time@KevinBowersox仅为该字段实例设置可访问性,未来对getDeclaredFields的调用将返回新实例。所以你可以让它超出范围,你会没事的。