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

Java 如何使用反射访问从抽象类继承的字段?,java,reflection,field,abstract,Java,Reflection,Field,Abstract,所以我有一个抽象的Geo类,它表示3D几何图形,所以它继承了向量位置和抽象方法等字段,比如更新和显示 因为我的多维数据集类继承自这个Geo类,所以我不重新声明我的字段,而只是在多维数据集类的构造函数中设置它们。当我没有从Geo继承并在多维数据集中声明字段时,我最初没有收到错误 但是,我注意到,当我尝试查看该字段是否存在时,它会抛出以下错误: java.lang.NoSuchFieldException: boundBox 这是检查字段(对象是立方体对象)的反射代码: 同样,我不会重新声明“bo

所以我有一个抽象的Geo类,它表示3D几何图形,所以它继承了向量位置和抽象方法等字段,比如更新和显示

因为我的多维数据集类继承自这个Geo类,所以我不重新声明我的字段,而只是在多维数据集类的构造函数中设置它们。当我没有从Geo继承并在多维数据集中声明字段时,我最初没有收到错误

但是,我注意到,当我尝试查看该字段是否存在时,它会抛出以下错误:

java.lang.NoSuchFieldException: boundBox
这是检查字段(对象是立方体对象)的反射代码:

同样,我不会重新声明“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(){
  }
}

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

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


哇,那是个简单的错误。谢谢你的解释。嗨,凯文。欢迎使用Stack Overflow和+1获得清晰易懂的答案。期待您的贡献!这种方法的优点是使用私有字段。但是,对于公共字段,
getFields()
是更简单、更好的解决方案
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(){
  }
}
try {
   Field field = object.getClass().getSuperclass().getDeclaredField("boundBox");
} catch(Exception e){
   e.printStackTrace();
}