2009-10-26 9 views
49

私は列挙型(私はClass<? extends Enum>を持っています)のクラスオブジェクトを持っており、この列挙体が表す列挙値のリストを取得する必要があります。 values静的関数には必要なものがありますが、クラスオブジェクトからアクセスする方法がわかりません。 反射を使用してJava Enums:列挙された値をクラス<? extends Enum>

+0

EnumSet.allOf(String.class); // won't compile 
その静的 - 反射。 – IAdapter

+0

'Class'はリフレクションオブジェクトです(パッケージに先行します)。 –

答えて

10

Class#getEnumConstants()を呼び出すように簡単です:

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

あなたが必要とする値の名前を知っている場合:あなたがいない場合は

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

を、あなたはそれらの配列を得ることができます(Tomが最初に得たように):

 klass.getEnumConstants(); 
3

私はEnumSet#allOf()が記載されていないことを確認するために驚いています:

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

は、指定された要素型のすべての要素を含むenumセットを作成します。

には、以下のenumを考えてみましょう:

enum MyEnum { 
    TEST1, TEST2 
} 

は、単にこのようにメソッドを呼び出します。もちろん

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

、これは、Setを返していないList、それはで十分なはず多くの(ほとんどの?)ユースケース。

あるいは、あなたが未知のenumを持っている場合:Class#getEnumConstants()に比べ

Class<? extends Enum> enumClass = MyEnum.class; 
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass); 

この方法の利点は、それにenum以外のものを渡すことはできませんように、それが入力されていることです。例えば、以下のコードは有効であり、nullを返す:

String.class.getEnumConstants(); 

これはコンパイルされません中:

関連する問題