dag*_*ies 45 java reflection enums
假设您有一个文本文件,如:
my_setting = ON
some_method = METHOD_A
verbosity = DEBUG
...
Run Code Online (Sandbox Code Playgroud)
您希望相应地更新相应的对象:
Setting my_setting = ON;
Method some_method = METHOD_A;
Verbosity verbosity = DEBUG;
...
Run Code Online (Sandbox Code Playgroud)
所有都是不同类型的枚举.
我想有一个通用的方法来实例化枚举值.也就是说,在运行时使用反射,并且事先不知道对象的枚举类型.
我会想象这样的事情:
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 //...
}
Run Code Online (Sandbox Code Playgroud)
问题是:应该有什么?是否有可能在给定String表示的情况下实例化一个未知的枚举?
Boz*_*zho 96
field.set(this, Enum.valueOf((Class<Enum>) field.getType(), value));
Run Code Online (Sandbox Code Playgroud)
getClass()
之后getType()
不应该叫-它返回一个类的Class
实例Class<Enum>
,以避免一般性问题,因为你已经知道它Class
是一个enum
小智 10
没有铸造的替代解决方案
try {
Method valueOf = field.getType().getMethod("valueOf", String.class);
Object value = valueOf.invoke(null, param);
field.set(test, value);
} catch ( ReflectiveOperationException e) {
// handle error here
}
Run Code Online (Sandbox Code Playgroud)
你有一个额外的getClass
电话,你必须施法(每个 Bozho 更具体的施法):
field.set(test, Enum.valueOf((Class<Enum>) field.getType(), value));
Run Code Online (Sandbox Code Playgroud)