是否可以使用反射访问protected
中Subclass
的{{1}}成员?
SuperClass
请注意,这与普通private void accessFields() {
Field[] fields = this.getClass().getDeclaredFields();
for(Field field : fields) {
if(Modifier.isProtected(field.getModifiers()) {
//Will this always work? Or will get(this) throw an IllegalAccessException?
Object value = field.get(this);
}
}
}
成员访问的方式相反,而protected
访问SubClass
成员,而protected
。
答案 0 :(得分:1)
你可以用反射做任何事情。如果您愿意,您甚至可以直接操作JVM的内存(sun.misc.Unsafe
)。
但是,如果您通常无权访问,则需要使用setAccessible
或类似内容。
答案 1 :(得分:1)
您可以使用反射访问对象的任何字段(私有,受保护,公共)。访问对象的私有字段的类是否是超类或子类(使用反射时)无关紧要。
PrivateObject privateObject = new PrivateObject("The Private Value");
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
只要您可以获取PrivateObject
类的对象,就可以访问其字段。请记得field.setAccessible(true)
访问非公开字段。