【问题标题】:Access protected fields of a subclass in a superclass?访问超类中子类的受保护字段?
【发布时间】:2013-05-27 23:45:17
【问题描述】:

是否可以使用反射在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

【问题讨论】:

  • 这似乎倒退了,因为超类不应该知道也不依赖于子类。为什么你还要考虑这个?我的建议是重新设计你的代码,这样它就不需要这个疯狂的要求了。
  • 当然,你可以做各种疯狂的反思。就像把枪放在你的脚上然后扣动扳机。你已经写好了代码,试试
  • 原因是我想注释子类字段,以便我可以使用超类中的注释字段。 (即:哪些字段应该保存在数据库中)?设计不好?好的,我再考虑考虑,谢谢!
  • 人们有各种不同的想法,但我发现超类实现一个也适用于所有子类的功能实际上是个好主意。这就是为什么要进行反射,以发现您在设计/编译时不知道的内容。

标签: java reflection protected


【解决方案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) 访问非公共字段。

【讨论】:

  • 谢谢,这回答了我的问题,如果可能的话。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2017-12-09
    • 2014-05-14
    • 2015-05-09
    • 1970-01-01
    • 2013-03-25
    • 2012-10-23
    • 2016-02-29
    • 2020-11-02
    相关资源
    最近更新 更多