理解
- 我们定义的枚举类时候定义enum类型实际上是个class,反编译会生成final class xxx extends Enum{}。生成转化的过程是编译时候jdk帮我们完成的工作。
- 枚举类的实例信息在初始化时候就已经决定了。采用了静态代码块形式初始化。
- 枚举的类不能被继承。class被finanl修饰。
- 枚举的构造器没有修饰。因为class会被添加上private修饰。
流程(以mac为例子)
- https://varaneckas.com/jad/ 下载反编译工具
- 配置环境变量将下载的后解压目录放到环境变量path里面
- 跳转到我们的生成的class目录里面
- 点击查看生生的xxx.jad(也可以直接在idea里面直接打开这个xx.jad文件w’q)
一个普通的枚举
package creational.singleton;
public enum EnumSingleton {
FIRSET("1","第一个"),SECEND("2","第二个");
private String value;
private String desc;
EnumSingleton(String value, String desc ){
this.value =value;
this.desc = desc;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
jad解析class生成的 xxx.jad
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: EnumSingleton.java
package creational.singleton;
public final class EnumSingleton extends Enum
{
public static EnumSingleton[] values()
{
return (EnumSingleton[])$VALUES.clone();
}
public static EnumSingleton valueOf(String name)
{
return (EnumSingleton)Enum.valueOf(creational/singleton/EnumSingleton, name);
}
private EnumSingleton(String s, int i, String value, String desc)
{
super(s, i);
this.value = value;
this.desc = desc;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
public String getDesc()
{
return desc;
}
public void setDesc(String desc)
{
this.desc = desc;
}
public static final EnumSingleton FIRSET;
public static final EnumSingleton SECEND;
private String value;
private String desc;
private static final EnumSingleton $VALUES[];
static
{
FIRSET = new EnumSingleton("FIRSET", 0, "1", "\u7B2C\u4E00\u4E2A");
SECEND = new EnumSingleton("SECEND", 1, "2", "\u7B2C\u4E8C\u4E2A");
$VALUES = (new EnumSingleton[] {
FIRSET, SECEND
});
}
}