近两天在看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{}静态块。