我正在尝试从通用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中是否可行?
提前感谢您提供任何可能的建议。
〜克里斯
答案 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传递给构造函数。