从Class <?获取枚举实例?扩展Enum>使用String值?

Cra*_*tis 24 java reflection enums class instantiation

我发现很难将确切的问题写成文字,所以我只想举个例子.

我有两种Enum类型:

enum Shape {
    CAT, DOG;
}

enum Color {
    BLUE, RED;
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法:

public Object getInstance(String value, Class<?> type);
Run Code Online (Sandbox Code Playgroud)

我想用这样的方法:

// someValue is probably "RED", and someEnumClass is probably Color.class
Color c = getInstance(someValue, someEnumClass);
Run Code Online (Sandbox Code Playgroud)

我一直无法确定如何实施getInstance().一旦知道了Enum要实例化的确切类,就很容易:

Color.valueOf("RED");
Run Code Online (Sandbox Code Playgroud)

但是如何通过一个未知的方式完成上述这一行Class呢?(但是,已知它someEnumClass是.的子类Enum.)

谢谢!

cha*_*tle 45

 public static <T extends Enum<T>> T getInstance(final String value, final Class<T> enumClass) {
     return Enum.valueOf(enumClass, value);
 }
Run Code Online (Sandbox Code Playgroud)

该方法用作:

final Shape shape = getInstance("CAT", Shape.class);
Run Code Online (Sandbox Code Playgroud)

然后,你可以随时使用

final Shape shape = Shape.valueOf("CAT");
Run Code Online (Sandbox Code Playgroud)

这是一个快捷方式

Enum.valueOf(Shape.class, "CAT");
Run Code Online (Sandbox Code Playgroud)

  • 还有@Paul,我正在建立一些枚举为ivars的类的实例,但枚举的值以字符串的形式提供。(例如,存储在数据库中。)我使用反射来确定Enum的实际类型,然后使用具有已知类的Enum.valueOf()和String值来设置字段。使用反射和Enum.valueOf()可使此方法工作,而不必知道实际存在哪些Enum类。 (2认同)