Java 如何在使用';s的字符串表示形式和类型在运行时是否已知?

Java 如何在使用';s的字符串表示形式和类型在运行时是否已知?,java,generics,reflection,enums,Java,Generics,Reflection,Enums,假设我的枚举为: com.mypackage.enums public enum Days { MONDAY, TUESDAY, WEDNESDAY } 现在我知道我需要从一个运行时字符串中获取enum MONDAY,该字符串被提供为“MONDAY”。我还知道此枚举位于com.mypackage.enums.Days中 我该怎么做?有无反省 编辑:字符串“星期一”和类com.mypackage.enum.Days都是在运行时确定的。类作为类的对象而不是字符串提供 可

假设我的枚举为:

com.mypackage.enums

public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY
}
现在我知道我需要从一个运行时字符串中获取enum MONDAY,该字符串被提供为“MONDAY”。我还知道此枚举位于com.mypackage.enums.Days中

我该怎么做?有无反省

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

可能的价值

com.mypackage.enums.Days.valueOf("MONDAY"); 
对于运行时类,可以使用静态“valueOf”方法

您可以使用:

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


您可能希望自己添加一点验证,然后仅针对这段代码抑制有关原始类型的警告。

不涉及原始类型(仅未选中强制转换)的@jonsket解决方案的替代方案:


您知道编译时或执行时是
?(如果是编译时,只需使用
Days.valueOf(name)
)它在执行时已知。类也在运行时确定。刚刚更新了详细信息。那么“Enum.valueOf(yourRuntimeType,yourRuntimeString)”呢?对,最后使用了这个。我拒绝了编辑,因为如果已经有类对象,我认为没有必要将
Enum.valueOf
调用包装到另一个方法中。直接使用
Enum.valueOf
。是的,这正适合本文的上下文。在我原来的方法中,我正在做更多的操作。使用泛型类型
T
似乎是多余的。如果你知道
T
你就不需要这个方法了。您最多只能返回
Enum
Enum.valueOf(yourRuntimeType, yourRuntimeString)
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);
    }
}
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));
}
Enum.valueOf(classObj, name);