Java枚举:列出一个Class<? extends Enum>中的枚举值列表

90

我有一个枚举类的类对象(我有一个 Class<? extends Enum>),需要获取该枚举类代表的所有枚举值的列表。静态函数 values 包含我需要的信息,但我不确定如何从类对象中访问它。


它是静态的 - 反射。 - IAdapter
“Class”是一个反射对象(它比包还要早)。 - Tom Hawtin - tackline
4个回答

172

23

如果您知道所需值的名称:

     Class<? extends Enum> klass = ... 
     Enum<?> x = Enum.valueOf(klass, "NAME");

如果没有,你可以通过以下方式获取它们的数组(就像Tom首先做的那样):

     klass.getEnumConstants();

18
我很惊讶地发现EnumSet#allOf()没有被提及:

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

创建一个包含指定元素类型中的所有元素的枚举集。

考虑以下enum

enum MyEnum {
  TEST1, TEST2
}

只需如下调用方法:

Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class);

当然,这将返回一个Set而不是List,但在许多(大多数?)情况下应该足够了。
或者,如果您有一个未知的enum
Class<? extends Enum> enumClass = MyEnum.class;
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass);

Class#getEnumConstants() 相比,此方法的优点在于它是类型化的,因此除了 enum 之外的任何内容都无法传递给它。例如,下面的代码是有效的并返回 null
String.class.getEnumConstants();

虽然这段代码无法编译:

EnumSet.allOf(String.class); // won't compile

1
看起来这个方法会更快。反射方法克隆了一个使用反射和安全API构建的共享数组。EnumSet使用存储在long中的“位向量”。 - Jeff Walker

15

使用反射和调用Class#getEnumConstants()一样简单:

List<Enum<?>> enum2list(Class<? extends Enum<?>> cls) {
   return Arrays.asList(cls.getEnumConstants());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接