当字符串表示和类型在运行时已知时,如何获取枚举?



假设我有一个Enum:

com.mypackage.enums
public enum Days {
    MONDAY,
    TUESDAY,
    WEDNESDAY
}

现在某个地方我知道我需要从运行时字符串"MONDAY"中获得enum MONDAY。我还知道这个枚举位于com.mypackage.enums.Days

我该怎么做?有还是没有反思?

编辑:字符串"MONDAY"和类com.mypackage.枚举. days都是在运行时确定的。Class是作为Class的对象而不是字符串提供的。

您可以使用Enum.valueOf(Class, String):

import java.util.*;
enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY
}
public class Test {
    public static void main(String[] args) throws Exception {
        String className = "Day";
        String name = "SATURDAY";
        // Note use of raw type       
        Class clazz = Class.forName(className);
        Enum value= Enum.valueOf(clazz, name);
        System.out.println("Parsed: " + value);
    }
}

现在这使用原始Class类型,这从来都不是很好-但我不确定这里有什么更好的选择。从根本上说,泛型是关于在编译时知道类型,而在这里不知道的情况。

您可能希望自己添加一些验证,然后在这段代码中只使用来抑制关于原始类型的警告。

@JonSkeet解决方案的替代方案,不涉及原始类型(仅未检查强制转换):

static <T extends Enum<T>> Enum<T> getValue(String className, String name)
        throws ClassNotFoundException {
    @SuppressWarnings("unchecked")
    Class<T> clazz = (Class<T>) Class.forName(className);
    return Enum.valueOf(clazz, name);
}
public static void main(String[] args) throws Exception {
    String className = "Day";
    String name = "SATURDAY";
    // Note use of raw type       
    System.out.println("Parsed: " + getValue(className, name));
}

当然如果你已经有了Class对象,你可以简单地使用

Enum.valueOf(classObj, name);

可能是valueOf ?

com.mypackage.enums.Days.valueOf("MONDAY"); 

对于运行时类,你可以使用静态的"valueOf"方法

Enum.valueOf(yourRuntimeType, yourRuntimeString)

相关内容

  • 没有找到相关文章

最新更新