2

我有 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() 或更改文件的可见性?
4

2 回答 2

0

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

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

于 2012-06-08T15:56:26.290 回答
0

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

可悲的是,这不是真的:继承是在普通父子对象中更紧密的关系,但仍然必须遵守访问规则,例如,如果protected在抽象类中声明了一个方法并且扩展类在不同的包中,那么它无法访问(反之亦然)。

因为该方法showFields()是在 中定义的AbstractTestClass,所以它只能访问该类中的字段。里面的田地TestClass基本上被围起来了。

我能想到的唯一解决方法是覆盖showFields()in TestClass,吞下任何关于无法访问私有字段的异常,然后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();
  }
}

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

于 2012-06-08T19:29:24.313 回答