如何在运行时知道它的字符串表示和类型时获取Enum?

时间:2015-09-21 05:47:56

标签: java generics reflection enums

假设我有一个Enum:

com.mypackage.enums

public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY
}

现在在某个地方,我知道我需要从运行时字符串中获取枚举星期一作为"星期一"。我也知道这个枚举在于com.mypackage.enums.Days

我该怎么做?有或没有反射?

编辑:字符串"星期一"和类com.mypackage.enum.Days在运行时确定。类作为Class的对象提供,而不是作为字符串。

3 个答案:

答案 0 :(得分:3)

您可以使用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类型,这种类型从来都不是很好 - 但我不确定这里有更好的选择。从根本上说,泛型是指在编译时你知道类型的情况,你不会在这里。

您可能希望自己添加一些验证,然后针对此段代码禁止有关原始类型 的警告。

答案 1 :(得分:2)

@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);

答案 2 :(得分:1)

perhapse valueOf?

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

对于运行时类,您可以使用静态“valueOf”方法

Enum.valueOf(yourRuntimeType, yourRuntimeString)