Java:使用反射实例化枚举
假设您有一个如下文本文件:
my_setting = ON
some_method = METHOD_A
verbosity = DEBUG
...
您希望相应地更新相应的对象:
Setting my_setting = ON;
Method some_method = METHOD_A;
Verbosity verbosity = DEBUG;
...
其中所有都是不同类型的枚举。
我想要一种通用的方法来实例化枚举值。也就是说,在运行时使用反射,并且事先不知道对象的枚举类型。
我会想象这样的事情:
for (ConfigLine line : lines)
{
String[] tokens = line.string.split("=", 2);
String name = tokens[0].trim();
String value = tokens[1].trim();
try
{
Field field = this.getClass().getDeclaredField(name);
if(field.getType().isEnum())
{
// doesn't work (cannot convert String to enum)
field.set(this, value);
// invalid code (some strange generics issue)
field.set(this, Enum.valueOf(field.getType().getClass(), value));
}
else
{ /*...*/ }
}
catch //...
}
问题是:应该有什么?是否有可能根据其字符串表示来实例化一个未知的枚举?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
getType()
之后的getClass()
- 它返回Class
实例的类Class ;
,以避免通用问题,因为您已经知道Class
是一个enum
getClass()
aftergetType()
should not be called - it returns the class of aClass
instanceClass<Enum>
, to avoid generic problems, because you already know that theClass
is anenum
无需铸造的替代解决方案
Alternative solution with no casting
您有一个额外的
getClass
调用,并且必须进行强制转换(每个 Bozho 都有更具体的强制转换):You have an extra
getClass
call, and you have to cast (more specific cast per Bozho):接受的答案会导致警告,因为它使用原始类型 Enum 而不是 Enum>。
要解决这个问题,您需要使用如下通用方法:
像这样调用它:
The accepted answer results in warnings because it uses the raw type Enum instead of Enum<T extends Enum<T>>.
To get around this you need to use a generic method like this:
Call it like this:
您可以对 Enum 进行类似的编码:
然后您可以轻松地从 String 创建 Enum 而无需反思:
这个解决方案不是源自我自己。我是从其他地方读到的,但记不起出处了。
You may code your Enum similar tho this:
Then you may easily create Enum from String without reflection:
This solution is not originated from myself. I read it from somewhere else, but I can't recall the source.