gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:03:02 25 4
gpt4 key购买 nike

我正在尝试构建一个使用反射来访问对象属性的动态包装器。我的方法适用于不同类型的对象——但我仍然对枚举有疑问。

假设我已经有了合适的 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);

最佳答案

给定一个 Enum 类和一个字符串值,您可以通过 java.lang.Enum 中定义的以下静态方法转换为与字符串对应的 Enum 对象:

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)

例如

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使用内部缓存。

关于java - 如何动态地从 String 转换为 Enum?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com