如何使用反射访问从抽象类继承的字段?

时间:2018-08-08 18:03:33

标签: java reflection field abstract

因此,我有一个抽象的Geo类,它表示3D几何形状,因此它继承了Vector位置和更新和显示之类的抽象方法之类的字段。

由于我的Cube类继承自此Geo类,因此我无需重新声明字段,而只需在Cube类的构造函数中设置它们即可。当我不继承自Geo并声明Cube类中的字段时,我最初没有得到错误。

但是,当我尝试查看该字段是否存在时,我注意到该错误:

java.lang.NoSuchFieldException: boundBox

这是用于检查字段(对象是Cube对象)的反射代码:

try {
   Field field = object.getClass().getDeclaredField("boundBox");
} catch(Exception e){
   e.printStackTrace();
}

因此,我不再重新声明“ boundBox”字段,因为我已经在Geo抽象类中对其进行了声明。这是我的抽象类和子类的基本部分:

abstract class Geo {
  public Vector pos;
  public BoundingBox boundBox;

  abstract void update();
  abstract void display();
}

class Cube extends Geo {
  public Cube(Vector pos, float dim){
    this.pos = pos; 
    boundBox = new BoundingBox(pos,dim);
  }
  @Override
  void update(){
  }
  @Override
  void display(){
  }
}

2 个答案:

答案 0 :(得分:6)

使用Class.getField()而不是Class.getDeclaredField()getDeclaredField()仅考虑由调用该方法的对象的类型声明的字段,而getField()递归地爬升超类型树以查找匹配项。

答案 1 :(得分:0)

如果您不想对类进行硬编码并执行(Geo.class.getDeclaredField("boundBox"))。您可以使用object.getClass()。getSuperclass()访问抽象类。

try {
   Field field = object.getClass().getSuperclass().getDeclaredField("boundBox");
} catch(Exception e){
   e.printStackTrace();
}