枚舉類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