我有两个从另一个类继承的类
class AEntity {
private String name;
public AEntity(String name){this.name = name;}
}
class Course extends AEntity {
private String code;
public Course(String name, String code){
super(name);
this.code = code;
}
}
class Classroom extends AEntity {
private String code;
public Classroom(String name, String code){
super(name);
this.code = code;
}
}
现在,有一个我要注意已创建的AEntity类型的“中间”类。不同的类可以创建不同类型的AEntity。
class AEntityDefinition {
private AEntity entity;
public void setEntity(AEntity ae){this.entity = ae;}
public AEntity getEntity(){return this.entity;}
}
现在,我有一个创建AEntity类实例的类,因此我使用
AEntityDefinition
类。class C1 {
private AEntityDefinition aEntityDefinition;
public C1(){
aEntityDefinition = new AEntityDefinition();
aEntityDefinition.setEntity(new Course("Course","Course code"));
}
}
最后,我想调用
getEntity()
以查看已创建的AEntity的类型。public class EntityDefinition {
public static void main(String[] dgf){
AEntityDefinition aEntityDefinition = new AEntityDefinition();
System.out.println(aEntityDefinition.getEntity() instanceof Course);
System.out.println(aEntityDefinition.getEntity());
}
}
运行项目将返回null,因为在类外未知
entity
变量。我的问题是:如何在不从C1传递的情况下获取main内部的AEntity类型?有什么方法可以做到,还是有另一种方法?先感谢您。内容:
我有一些客户端代码在AEntityDefinition内创建和存储一个AEntity,该实体是另一个(未指定)类中的字段。我希望能够解决此问题而不必过多更改客户端类的代码,或者最好根本不更改,因为有很多类可以作为容器。
最佳答案
您可以提供一个吸气剂:
class C1 {
private AEntityDefinition aEntityDefinition;
public C1(){
aEntityDefinition = new AEntityDefinition();
aEntityDefinition.setEntity(new Course("Course","Course code"));
}
public Class<? extends AEntity> getEntityType() {
return aEntityDefinition.getEntity().getClass();
}
}
如果实体定义或实体可以为空,则可能需要在其中进行一些空检查。
如果您不能更改类C1,但是您知道它具有一个
AEntityDefinition
字段,并且想要获取对其中的AEntity实例的引用,则可以使用反射:public static Class<? extends AEntity> getEntityType(Object o) throws Exception {
for (Field field : o.getClass().getDeclaredFields()) {
if (AEntityDefinition.class.isAssignableFrom(field.getType())) {
AEntityDefinition def = (AEntityDefinition) field.get(o);
return def.getEntity().getClass();
}
}
return null;
}
关于java - Java如何知道已创建对象的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26588873/