调用类中定义的私有对象的方法(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的调用将返回新实例。所以你可以让它超出范围,你会没事的。