源代码:

public enum Season {    SPIRNG,    SUMMER,    AUTUMN,    WINTER;    public String allSeasons() {        return SPIRNG.name() + " " + SUMMER.name() + " " + AUTUMN.name() +" " +WINTER.name();    }}

编译之后使用javap -c Season.class命令反编译结果:

public final class Season extends java.lang.Enum<Season> {  public static final Season SPIRNG;  public static final Season SUMMER;  public static final Season AUTUMN;  public static final Season WINTER;  public static Season[] values();    Code:       0: getstatic     #1                  // Field $VALUES:[LSeason;       3: invokevirtual #2                  // Method "[LSeason;".clone:()Ljava/lang/Object;       6: checkcast     #3                  // class "[LSeason;"       9: areturn  public static Season valueOf(java.lang.String);    Code:       0: ldc           #4                  // class Season       2: aload_0       3: invokestatic  #5                  // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;       6: checkcast     #4                  // class Season       9: areturn  public java.lang.String allSeasons();    Code:       0: new           #7                  // class java/lang/StringBuilder       3: dup       4: invokespecial #8                  // Method java/lang/StringBuilder."<init>":()V       7: getstatic     #9                  // Field SPIRNG:LSeason;      10: invokevirtual #10                 // Method name:()Ljava/lang/String;      13: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      16: ldc           #12                 // String      18: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      21: getstatic     #13                 // Field SUMMER:LSeason;      24: invokevirtual #10                 // Method name:()Ljava/lang/String;      27: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      30: ldc           #12                 // String      32: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      35: getstatic     #14                 // Field AUTUMN:LSeason;      38: invokevirtual #10                 // Method name:()Ljava/lang/String;      41: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      44: ldc           #12                 // String      46: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      49: getstatic     #15                 // Field WINTER:LSeason;      52: invokevirtual #10                 // Method name:()Ljava/lang/String;      55: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;      58: invokevirtual #16                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;      61: areturn  static {};    Code:       0: new           #4                  // class Season       3: dup       4: ldc           #17                 // String SPIRNG       6: iconst_0       7: invokespecial #18                 // Method "<init>":(Ljava/lang/String;I)V      10: putstatic     #9                  // Field SPIRNG:LSeason;      13: new           #4                  // class Season      16: dup      17: ldc           #19                 // String SUMMER      19: iconst_1      20: invokespecial #18                 // Method "<init>":(Ljava/lang/String;I)V      23: putstatic     #13                 // Field SUMMER:LSeason;      26: new           #4                  // class Season      29: dup      30: ldc           #20                 // String AUTUMN      32: iconst_2      33: invokespecial #18                 // Method "<init>":(Ljava/lang/String;I)V      36: putstatic     #14                 // Field AUTUMN:LSeason;      39: new           #4                  // class Season      42: dup      43: ldc           #21                 // String WINTER      45: iconst_3      46: invokespecial #18                 // Method "<init>":(Ljava/lang/String;I)V      49: putstatic     #15                 // Field WINTER:LSeason;      52: iconst_4      53: anewarray     #4                  // class Season      56: dup      57: iconst_0      58: getstatic     #9                  // Field SPIRNG:LSeason;      61: aastore      62: dup      63: iconst_1      64: getstatic     #13                 // Field SUMMER:LSeason;      67: aastore      68: dup      69: iconst_2      70: getstatic     #14                 // Field AUTUMN:LSeason;      73: aastore      74: dup      75: iconst_3      76: getstatic     #15                 // Field WINTER:LSeason;      79: aastore      80: putstatic     #1                  // Field $VALUES:[LSeason;      83: return}

编译之后使用Java Decompiler的反编译结果:

public enum Season{  SPIRNG,  SUMMER,  AUTUMN,  WINTER;    private Season() {}    public String allSeasons()  {    return SPIRNG.name() + " " + SUMMER.name() + " " + AUTUMN.name() + " " + WINTER.name();  }}

反编译结果不相同可以分为两部分:

  1. javap反编译结果包含了static(),valueOf方法;
  2. javap反编译结果的方法体使用了jvm指令。