枚举类Explore如下:
package com.study;
public enum Explore {
HERE,THERE;
}
编译:javac Explore.java
反编译:javap Explore
具体操作如下:
反编译结果如下:
public final class com.study.Explore extends java.lang.Enum<com.study.Explore> {
public static final com.study.Explore HERE;
public static final com.study.Explore THERE;
public static com.study.Explore[] values();
public static com.study.Explore valueOf(java.lang.String);
static {};
}
从反编译结果我们可以看出多出了values()方法和valueOf(String)方法(注意:valueOf只有一个参数),这两个方法就是编译器自动生成的.
所以在使用values()获取所有Enum实例的时候有一个注意点:
由于values()是在编译器插入到Explore的static方法,所以如果你向上转型为Enum,那么values()就消失了.但Class对象中有一个getEnumConstants()方法,即使没有values()也可以获取到所有的Enum实例.
代码证明如下:
public static void main(String[] args) {
Explore[] values = Explore.values();
System.out.println("values = " + Arrays.toString(values));
Explore e1 = Explore.HERE;
Explore[] values1 = e1.values();
System.out.println("values1 = " + Arrays.toString(values1));
//向上转型为Enum. 由于values()是在编译器插入到Explore的static方法,所以如果你向上转型为Enum,那么values()就消失了
Enum e = Explore.HERE;
//e.values(); //没有这个方法
//Class对象中有一个getEnumConstants()方法,即使没有values()也可以获取到所有的Enum实例
for (Enum enumConstant : e.getClass().getEnumConstants()) {
System.out.println(enumConstant);
}
//因为getEnumConstants()方法是在class对象中的,所有即使不是Enum类型也可以调用,只是返回的是一个null
System.out.println(Integer.class.getEnumConstants());
}
输出结果:
values = [HERE, THERE]
values1 = [HERE, THERE]
HERE
THERE
null