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