【发布时间】:2018-07-21 18:22:38
【问题描述】:
我有三个类:一个基类A 和两个类B 和C,它们都扩展了A。 A 和 B 在同一个包中,C 在不同的包中。
B 和 C 都有一个受保护的成员变量。 A 有一个方法(我们称之为reflect),它使用反射和字符串输入通过this 指针访问具有此子类名称的字段。
从B 对象调用reflect 很好,但是从C 对象调用它会导致IllegalAccessException。我无法理解这个异常,因为这意味着C 没有访问权限来访问自己的成员变量。为什么java不允许这种反射?
这里有一个 MWE 来澄清我的意思:
在parent/A.java:
package Parent;
public abstract class A {
public Object reflect(String parameter) throws NoSuchFieldException, IllegalAccessException{
Class cl = getClass();
return cl.getDeclaredField(parameter).get(this);
}
}
在parent/B.java:
package Parent;
public class B extends A{
protected Integer b;
public B(Integer b){
this.b = b;
}
}
在parent/child/C.java:
package Parent.Child;
import Parent.A;
public class C extends A{
protected Integer c;
public C(Integer c){
this.c = c;
}
}
还有一个小主线:
import Parent.A;
import Parent.B;
import Parent.Child.C;
public class test {
public static void main(String args[]) {
B j1 = new B(10);
C j2 = new C(20);
try{
Integer b_copy = (Integer)j1.reflect("b");
System.out.println(b_copy); // prints "10"
Integer c_copy = (Integer)j2.reflect("c"); // throws java.lang.IllegalAccessException: Class Parent.A can not access a member of class Parent.Child.C with modifiers "protected"
System.out.println(c_copy);
} catch (NoSuchFieldException | IllegalAccessException e) {
System.out.println(e);
}
}
}
非常感谢!
【问题讨论】:
标签: java reflection