我有一个班级:
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
方法?
答案 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);