java列舉enum類中的values()
阿新 • • 發佈:2019-02-13
近兩天在看spring原始碼時在用EA工具逆向生成spring-web的ER圖看到了HttpMethod()這個列舉類,如圖
這個類中的靜態塊
static {
for (HttpMethod httpMethod : values()) {
mappings.put(httpMethod.name(), httpMethod);
}
}
用到了values();使用ecplise搜尋了它的本類發現沒有這個方法,然後查看了列舉類列舉型別的公共基本類也沒有該方法。然後查閱網上資料得知,
最直接的方法就是查閱JDK的文件了,Oracle線上文件的地址在這裡:
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
從閱讀文件得知,Java編譯器會自動在enum型別中插入一些方法,其中就包括values()——所以我們的程式在沒編譯的時候,自然沒法檢視values()方法的原始碼了。
如下是我實驗過的類
package com;
public enum EnumTest {
BLACK(2,"黑色"),pine, RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4); private String name; private int index; EnumTest(String name, int index) { this.name = name; this.index = index; } EnumTest() { } EnumTest(int index,String name) { this.index=index; this.name = name; } public static void getPerName(){ for(EnumTest enumTest:values()){ System.out.println(enumTest.name()); } } public static String getName(int index) { for (EnumTest c : EnumTest.values()) { if (c.getIndex() == index) { return c.name; } } return null; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; }
}
在cmd中先使用javac編譯EnumTest,然後在使用javap反編譯EnumTest.class
從圖中可以看出該類是繼承自java.lang.enum;而且自動增加了values()、valueOf()等方法。還有一個空的static{}靜態塊。