7

我有代码使用它的 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;

问题是在方法中放入什么convertToEnumtype我知道我可以通过迭代对象的枚举常量(或字段),匹配值来“暴力破解” 。我是否忽略了使用反射的更简单方法?(我查看了几个示例,但没有找到仅通过类知道枚举的任何地方)。

4

3 回答 3

23

在我的头顶上:

  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()方法必须进行该检查才能正常工作。

以下给了我一个编译错误:

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)

转换为通配符类型的复杂性让我感到困惑,所以我可能尝试了错误的转换。再加上它没有运行时影响这一事实意味着它很容易出错并且永远不会发现。

于 2013-06-11T18:52:43.007 回答
4

您可以使用

Class enumType = ....
String name = ....

Enum e = Enum.valueOf(enumType, name);

例如

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
于 2013-06-11T18:52:51.953 回答
1
Enum.valueOf(yrEnum, myString)

返回枚举,其中 myString 是您想要的枚举实例的名称。并yrEnum.values()返回所有不同可能的 Enums 实例的数组。

于 2013-06-11T18:52:16.930 回答