当 Enum 的字符串表示和类型在运行时已知时如何获取 Enum?
How to get Enum when it's string representation and type are known at Runtime?
假设我有一个枚举:
com.mypackage.enums
public enum Days {
MONDAY,
TUESDAY,
WEDNESDAY
}
现在我知道我需要从 "MONDAY" 提供的运行时字符串中获取枚举 MONDAY。我也知道这个枚举位于 com.mypackage.enums.Days
我该怎么做?有或没有反射?
编辑:字符串 "MONDAY" 和 Class com.mypackage.enum.Days 都是在运行时确定的。 Class 作为 Class 的对象而不是字符串提供。
也许值?
com.mypackage.enums.Days.valueOf("MONDAY");
对于运行时 类 你可以使用静态 "valueOf" 方法
Enum.valueOf(yourRuntimeType, yourRuntimeString)
您可以使用 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);
假设我有一个枚举:
com.mypackage.enums
public enum Days {
MONDAY,
TUESDAY,
WEDNESDAY
}
现在我知道我需要从 "MONDAY" 提供的运行时字符串中获取枚举 MONDAY。我也知道这个枚举位于 com.mypackage.enums.Days
我该怎么做?有或没有反射?
编辑:字符串 "MONDAY" 和 Class com.mypackage.enum.Days 都是在运行时确定的。 Class 作为 Class 的对象而不是字符串提供。
也许值?
com.mypackage.enums.Days.valueOf("MONDAY");
对于运行时 类 你可以使用静态 "valueOf" 方法
Enum.valueOf(yourRuntimeType, yourRuntimeString)
您可以使用 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);