我有3个类Foo1
,Foo2
和Foo3
,而Object可以是这3种类型中的任何一种。随机对象给我一个字段,说明类型。所以喜欢:
{
type: foo1
}
现在我可以很好地读取该值,并且我有一个类似的枚举类:
public enum ObjectType {
FOO1,
FOO2,
FOO3;
}
我希望能够从相应的枚举值中确定对象的类型。那么如何将枚举值链接到相应的类,以便当我读入type
值时,我可以判断对象是Foo1
,Foo2
还是{{1 }}
答案 0 :(得分:1)
这样的事情(您可以编辑我的代码,只需get(String jsonType)
方法)直接获取Class
而无需获取枚举,然后是课程。
public static enum FooClassEnum
{
Foo1("foo1", FOO1.class),
Foo2("foo2", FOO2.class),
Foo3("foo3", FOO3.class);
private final Class myClass;
private final String jsonType;
FooClassEnum(String jsonType, Class myClass){
this.myClass = myClass;
this.jsonType = jsonType;
}
public static FooClassEnum get(String jsonType) {
for (FooClassEnum ft : values())
if (ft.getJsonType().equals(jsonType))
return ft;
return null;
}
public Class getFooClass() {
return myClass;
}
public String getJsonType() {
return jsonType;
}
}
假设json中的类型为foo1
:
FooClassEnum classEnum = FooClassEnum.get("foo1");
Class classOfYourJson = classEnum.getFooClass();
//Cast your object
Object yourObj;
if(classOfYourJson.newInstance() instanceof Foo1) {
Foo1 f1 = (Foo1) yourObj;
} else if(classOfYourJson.newInstance() instanceof Foo2) {
Foo2 f2 = (Foo2) yourObj;
} else if(classOfYourJson.newInstance() instanceof Foo3) {
Foo3 f3 = (Foo3) yourObj;
} else {
//error
}
答案 1 :(得分:0)
那么如何将枚举值链接到相应的类以便这样做 当我读入类型值时,我可以判断对象是否是类型 Foo1,Foo2或Foo3。
在Class
枚举中添加ObjectType
字段,如下所示
public enum ObjectType {
FOO1(Foo1.class),
FOO2(Foo2.class),
FOO3(Foo3.class);
private Class klass;
ObjectType(Class klass) {
this.klass = klass;
}
// ... klass getter
}
答案 2 :(得分:0)
一种方法是在某处使用地图。
{
// define and populate the map
public static final Map<ObjectType,Class> typeMap;
static {
Map<ObjectType,Class> tempMap = new Hashtable<ObjectType,Class>;
tempMap.add(ObjectType.FOO1,Foo1.class);
tempMap.add(ObjectType.FOO2,Foo2.class);
tempMap.add(ObjectType.FOO3,Foo3.class);
typeMap = Collections.unmodifiableMap(tempMap);
}
// use it
{
// actually you probably want a superclass of Foo{1,2,3} ...
Object newObj = typeMap.get(tempObj.type.toUpperCase()).newInstance();
newObj.initalizeFrom(tempObj);
但是,我不确定你需要枚举。如果&#34;键入&#34;字段实际上是类名,你可以直接反映它。
{
// ...
newObj = Class.forName(tempObj.type).newInstance();
或者您可以使用合适的命名标准进行其他转换。
{
// ...
newObj = Class.forName(PACKAGE + "."
+ StringUtils.capitalize(tempObj.type) ).newInstance();