繁体   English   中英

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

[英]Access protected fields of a subclass in a superclass?

是否可以使用反射从SuperClass Subclass访问protected成员?

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

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

但是,如果您通常无法访问,则需要使用setAccessible或类似功能。

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

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)来访问非公共字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM