从Java中获取Enum类型参数的信息

时间:2013-02-09 03:45:42

标签: java generics enums

我正在尝试从通用Java类中访问任意Enum的属性。特别是,我想访问Enum中的值的数量以及实际值本身。

这个(显然是愚蠢的)虚拟代码说明了意图:

public class Test <E extends Enum>{
    public enum TestEnum {
        FIRST, SECOND, THIRD
    }
    public Test() {
        System.out.println(E.values().length);   //error - won't compile
    }
    public static void main(String[] args) {
        Test<TestEnum> t = new Test<TestEnum>();
    }
}

StackOverflow上有类似问题的解决方案,但它们需要修改Enum。这里的代码非常重要,任意任意枚举。

这在Java中是否可行?

提前感谢您提供任何可能的建议。

〜克里斯

2 个答案:

答案 0 :(得分:3)

您可以使用反射和编译器在创建枚举时自动添加的静态值方法。

public class Test {

    public enum TestEnum {
        FIRST, SECOND, THIRD
    }

    public Test(Class<? extends Enum> enumType) throws IllegalAccessException,
            InstantiationException, NoSuchMethodException,
            InvocationTargetException {
        Enum[] values = (Enum[]) enumType.getDeclaredMethod("values").invoke(
            null);
        System.out.println(Arrays.toString(values));
    }

    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {
        Test t = new Test(Test.TestEnum.class);
    }
}


>> [FIRST, SECOND, THIRD]

答案 1 :(得分:0)

要在运行时访问实际的E类,应该在编译时明确设置。

将其设置为类型参数对于java类型擦除不起作用。 我刚刚编译了Test类,并为它运行javap:

...
public static void main(java.lang.String[]);
  Code:
   0:   new #2; //class Test
   3:   dup
   4:   invokespecial   #3; //call no-arg constructor "<init>":()V
   7:   astore_1            // store object reference to local variable 't'
   8:   return

因此,构造函数对TestEnum类型参数一无所知。

最合适的解决方案是将类参数作为@stampy88 wrote传递给构造函数。