Java 当枚举类型引用是类时,如何将字符串转换为枚举值<>;?

Java 当枚举类型引用是类时,如何将字符串转换为枚举值<>;?,java,reflection,enums,Java,Reflection,Enums,我有一个使用setter方法在对象上设置值的代码。其中一个setter将枚举类型作为方法参数。代码如下所示: String value = "EnumValue1"; Method setter = getBeanWriteMethod("setMyEnumValue"); Class<?> type = setter.getParameterTypes()[0]; Object convertedValue = null; if (type.

我有一个使用setter方法在对象上设置值的代码。其中一个setter将枚举类型作为方法参数。代码如下所示:

    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;
String value=“EnumValue1”;
方法setter=getBeanWriteMethod(“setMyEnumValue”);
类类型=setter.getParameterTypes()[0];
Object convertedValue=null;
if(type.isEnum()){
convertedValue=convertToEnum(值,类型);
}否则{
convertedValue=ClassUtils.convertType(值,类型);
}
返回转换值;
问题是在
convertToEnum
方法中放置什么。我知道我可以通过迭代
类型
对象的枚举常量(或字段)并匹配值来“强制执行”。我是否忽略了使用反射的更简单方法?(我看了几个例子,但没有发现枚举只通过类知道的地方)

返回枚举,其中myString是所需枚举实例的名称。
yrEnum.values()

  Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type,  value);
转换为通配符类型的复杂性让我困惑,所以我可能尝试了错误的转换。另外,它没有运行时效果这一事实意味着它很容易出错,而且永远不会被发现。

您可以使用

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

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

印刷品

SOURCE

和之前一样,这项工作需要演员阵容。谢谢,我第一次尝试时一定是演员阵容搞错了。这是正确的解决方案。不幸的是,在尝试此操作之后,我发现需要进行不区分大小写的匹配,而
Enum.valueOf()
则不行。那么回到暴力手段…这个案子很糟糕
type
不是
Enum.class
。在任何情况下,
asSubclass
都比hack cast好。@TomHawtin-tackline:使用as
asSubclass
会给我编译器警告<代码>Class convertedValue=Enum.valueOf(enumClass,“Value1”)。因此,我不确定这是不是更好。问题是,如果
类型
变量被声明为
,则必须强制转换它,否则它将无法编译。如果它被声明为
(无通配符),则它可以在不强制转换的情况下工作。我搞砸了,因为
Method.getParameterTypes()
的返回类型是
Class[]
,这使得我需要强制转换提供了“绑定不匹配:Enum类型的泛型方法valueOf(Class,String)不适用于参数(Class,String)。推断的类型capture#2-of?不是绑定参数的有效替代品”。另一个给了我一个警告:“类型安全:Enum类型的泛型方法valueOf(Class,String)的未选中调用valueOf(Class,String)”——因为“asSubClass”返回一个
Class@SamGoldberg那是一种原始类型。所以我认为它会起作用。很糟糕。@TomHawtin-tackline:没有演员阵容,我无法编译它。@SamGoldberg看我的例子。不需要演员阵容。是的,我明白了。如果我在一个类和一个类之间切换,那么它可以正常工作并且编译得很好。@SamGoldberg和代码更简单,但是做的是相同的事情。
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)
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