我正在尝试构建一个使用反射来访问对象属性的动态包装器。我的方法适用于不同类型的对象 - 但我仍然遇到Enums问题。
假设我已经拥有了正确的setter和getter,我想在不同的情况下调用它们。例如,我试图通过以下代码保存给定值:
public void save() {
try {
// Enums come in as Strings... we need to convert them!
if (this.value instanceof String && this.getter.getReturnType().isEnum()) {
// FIXME: HOW?
}
this.setter.invoke(this.entity, this.value);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
throw new RuntimeException("Die Eigenschaft " + this.property + " von Entity " + this.entity.getClass().getSimpleName() + " konnte nicht geschrieben werden!", ex);
}
}
如何将String对象转换为正确的Enum值?
我知道MyEnum.valueOf(String)
...但是如果我不能在源代码中命名Enum怎么办?我没有设法使用像
this.value = Enum.valueOf(this.getter.getReturnType(), this.value);
答案 0 :(得分:3)
给定一个Enum类和一个字符串值,您可以通过java.lang.Enum
中定义的以下静态方法转换为与该字符串对应的Enum对象:
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
e.g。
java.awt.Window.Type type = Enum.valueOf(java.awt.Window.Type.class, "NORMAL");
请注意,如果没有相应的枚举常量,Enum.valueOf
会抛出IllegalArgumentException
。
由于Enum.valueOf
是getter.getReturnType()
,因此您无法在未使用方法强制转换的情况下调用Class<?>
。
因此辅助函数可以处理强制转换:
@SuppressWarnings("unchecked")
private static <E extends Enum<E>> E getEnumValue(Class<?> c, String value)
{
return Enum.valueOf((Class<E>)c, value);
}
您只需在代码中使用它:
if (this.value instanceof String && this.getter.getReturnType().isEnum())
this.value = getEnumValue(getter.getReturnType(), (String)this.value));
请注意,循环遍历Enum.getEnumConstants()
的任何解决方案都将为常量创建临时数组,而Enum.valueOf
使用内部缓存。
答案 1 :(得分:0)
只是找到了一种方式......但似乎&#34;脏&#34; ......更好?
if (this.value instanceof String && this.getter.getReturnType().isEnum()) {
for (Object v : this.getter.getReturnType().getEnumConstants()) {
if (v.toString().equals(this.value)) {
this.value = v;
break;
}
}
}