繁体   English   中英

通过Java中的反射访问抽象类中的子字段

[英]accessing child fields in abstract class throught reflection in java

我有2节课:

public abstract class AbstractTestClass {
    private String abstractString = "abstract";
    public void showFields() throws IllegalAccessException{
        for (Field field : this.getClass().getDeclaredFields()) {
            System.out.println(field.get(this));
        }
    }
}

public class TestClass extends AbstractTestClass {
    private String concreteString = "concreteString";
}

并测试:

public class MainTest {
    public static void main(String[] args) throws IllegalAccessException{
        TestClass test = new TestClass();
        test.showFields();
    }
}

运行此测试会导致下一个异常:

java.lang.IllegalAccessException: Class AbstractTestClass can not access a member of class TestClass with modifiers "private"

当我调试代码时,它包含TestClass的实例。

问题:

  1. 为什么会发生?
  2. 如何使此代码有效,而不使用Field.setAccessible()或更改文件的可见性?

如何使此代码有效,而不使用Field.setAccessible()或更改文件的可见性?

您不能,必须使该字段可访问才能使用它

我相信您犯的错误与我刚开始时犯的错误相同:抽象类和扩展类是两部分焊接在一起,形成一个可以访问其他所有字段和方法等的单个类。

令人遗憾的是,这是不正确的:继承与普通父子对象中的关系更为紧密,但是访问规则仍必须遵守,例如,如果在抽象类中声明了方法的protected ,而扩展类在另一个包中,则无法访问它(反之亦然)。

因为方法showFields()是在AbstractTestClass定义的,所以它只能访问该类中的字段。 TestClass中的字段实际上是隔离的。

我能想到的唯一解决方法是在TestClass重写showFields() ,吞下有关无法访问私有字段的所有异常,然后调用super.showFields()并再次吞入任何异常。 不漂亮。

public abstract class AbstractTest {
  private String abstractString = "abstract";
  public void showFields() throws IllegalAccessException {
    for (Field field : this.getClass().getSuperclass().getDeclaredFields()) {
      try {
        System.out.println(field.get(this));
      }
      catch (IllegalAccessException e) { 
        // swallow 
      }
    }
  }
}

public class MyTest extends AbstractTest
{
  private String concreteString = "concreteString";
  @Override public void showFields() throws IllegalAccessException {
    for (Field field : this.getClass().getDeclaredFields()) {
      try {
        System.out.println(field.get(this));
      }
      catch (IllegalAccessException e) {  
        // swallow
      }
    }
    super.showFields();
  }
}

我怀疑这就是你的想法...

暂无
暂无

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

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