我的代码是使用setter方法在对象上设置值。其中一个setter将Enum类型作为方法参数。代码看起来像这样:
String value = "EnumValue1";
Method setter = getBeanWriteMethod("setMyEnumValue");
Class<?> type = setter.getParameterTypes()[0];
Object convertedValue = null;
if (type.isEnum()) {
convertedValue = convertToEnum(value, type);
} else {
convertedValue = ClassUtils.convertType(value, type);
}
return convertedValue;
问题是在convertToEnum
方法中放入什么。我知道我可以通过迭代type
对象的枚举常量(或字段)来“强制它”,匹配该值。我是否忽略了使用Reflection进行更简单的方法? (我查看了几个例子,但没有找到任何枚举只能通过Class知道的地方)。
答案 0 :(得分:21)
脱离我的头顶:
Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type, value);
这会将字符串转换为类型为
的Enum类的枚举常量编辑:现在我有一台电脑,我可以看到实际上有什么用。在没有编译器警告的情况下,以下任一情况都正确运行:
Enum<?> convertedValueA = Enum.valueOf(type, value);
Enum<?> convertedValueB = Enum.valueOf(type.asSubclass(Enum.class), value);
第二个调用asSubClass(),它会进行运行时检查以确保type
是一些枚举类,但valueOf()
方法必须进行检查才能正常工作。< / p>
以下给了我一个编译错误:
Enum<?> convertedValueC = Enum.valueOf((Class<? extends Enum <?>>)type, value);
java: Foo.java:22: <T>valueOf(java.lang.Class<T>,java.lang.String) in java.lang.Enum cannot be applied to (java.lang.Class<capture#134 of ? extends java.lang.Enum<?>>,java.lang.String)
投射到通配符类型的复杂性使我感到困惑所以我可能尝试过错误的演员。此外,它没有运行时效果,这意味着很容易弄错,永远不会发现。
答案 1 :(得分:4)
您可以使用
Class enumType = ....
String name = ....
Enum e = Enum.valueOf(enumType, name);
e.g。
import java.lang.annotation.*;
public class Main {
public static void main(String[] args) {
Class enumType = RetentionPolicy.class;
String name = "SOURCE";
Enum e = Enum.valueOf(enumType, name);
System.out.println(e);
}
}
打印
SOURCE
答案 2 :(得分:1)
Enum.valueOf(yrEnum, myString)
返回枚举,其中myString是所需枚举实例的名称。
yrEnum.values()
返回所有不同可能的枚举实例的数组。