访问超类中子类的受保护字段?

时间:2013-06-01 05:24:12

标签: java reflection protected

是否可以使用反射访问protectedSubclass的{​​{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

2 个答案:

答案 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)访问非公开字段。