因此,我有一个抽象的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(){
}
}
答案 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();
}