Java使用Enums确定类类型

时间:2016-03-10 14:07:15

标签: java reflection enums

我有3个类Foo1Foo2Foo3,而Object可以是这3种类型中的任何一种。随机对象给我一个字段,说明类型。所以喜欢:

{
    type: foo1
}

现在我可以很好地读取该值,并且我有一个类似的枚举类:

public enum ObjectType {
    FOO1,
    FOO2,
    FOO3;
}

我希望能够从相应的枚举值中确定对象的类型。那么如何将枚举值链接到相应的类,以便当我读入type值时,我可以判断对象是Foo1Foo2还是{{1 }}

3 个答案:

答案 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();