如何动态地从String转换为Enum?

时间:2015-07-22 08:57:57

标签: java enums

我正在尝试构建一个使用反射来访问对象属性的动态包装器。我的方法适用于不同类型的对象 - 但我仍然遇到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);

2 个答案:

答案 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.valueOfgetter.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;
        }
    }
}