1

是否可以从使用反射中访问protected成员?SubclassSuperClass

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成员,而是SuperClass.

4

2 回答 2

3

您可以使用反射访问对象的任何字段(私有、受保护、公共)。访问对象的私有字段的类是它的超类还是子类(使用反射时)并不重要。

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);

只要你能拿到PrivateObjectClass的一个对象,你就可以访问它的字段。请记住field.setAccessible(true)访问非公共字段。

于 2013-06-01T06:11:07.817 回答
1

你可以用反射做任何事情。如果您愿意,您甚至可以直接操作 JVM 的内存 ( sun.misc.Unsafe)。

但是,如果您通常没有访问权限,则需要使用setAccessible或类似的。

于 2013-06-01T05:43:03.103 回答