從枚舉類型反編譯的結果探究values()方法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章