java枚举的原理分析

美女程序员鼓励师

本教程操作环境:windows7系统、java10版,DELL G3电脑。

编译时编译器会做很多操作,我们用javap-v反编译Season.class文件,可以看到很多细节。

1、枚举是继承了抽象类Enum的类。

Season extends java.lang.Enum<Season>

2、通过一段静态代码块初始化枚举。

  static {};

    descriptor: ()V

    flags: ACC_STATIC

    Code:

      stack=4, locals=0, args_size=0

         0: new           #4                  // class io/github/yehongzhi/user/redisLock/Season

         3: dup

         4: ldc           #7                  // String SPRING

         6: iconst_0

         7: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V

        10: putstatic     #9                  // Field SPRING:Lio/github/yehongzhi/user/redisLock/Season;

        13: new           #4                  // class io/github/yehongzhi/user/redisLock/Season

        16: dup

        17: ldc           #10                 // String SUMMER

        19: iconst_1

        20: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V

        23: putstatic     #11                 // Field SUMMER:Lio/github/yehongzhi/user/redisLock/Season;

        26: new           #4                  // class io/github/yehongzhi/user/redisLock/Season

        29: dup

        30: ldc           #12                 // String AUTUMN

        32: iconst_2

        33: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V

        36: putstatic     #13                 // Field AUTUMN:Lio/github/yehongzhi/user/redisLock/Season;

        39: new           #4                  // class io/github/yehongzhi/user/redisLock/Season

        42: dup

        43: ldc           #14                 // String WINTER

        45: iconst_3

        46: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V

        49: putstatic     #15                 // Field WINTER:Lio/github/yehongzhi/user/redisLock/Season;

        52: iconst_4

        53: anewarray     #4                  // class io/github/yehongzhi/user/redisLock/Season

        56: dup

        57: iconst_0

        58: getstatic     #9                  // Field SPRING:Lio/github/yehongzhi/user/redisLock/Season;

        61: aastore

        62: dup

        63: iconst_1

        64: getstatic     #11                 // Field SUMMER:Lio/github/yehongzhi/user/redisLock/Season;

        67: aastore

        68: dup

        69: iconst_2

        70: getstatic     #13                 // Field AUTUMN:Lio/github/yehongzhi/user/redisLock/Season;

        73: aastore

        74: dup

        75: iconst_3

        76: getstatic     #15                 // Field WINTER:Lio/github/yehongzhi/user/redisLock/Season;

        79: aastore

        80: putstatic     #1                  // Field $VALUES:[Lio/github/yehongzhi/user/redisLock/Season;

        83: return

这段静态代码块的作用就是生成四个静态常量字段的值,还生成了$VALUES字段,用于保存枚举类定义的枚举常量。

3、关于values()方法,这是一个静态方法,作用是返回该枚举类的数组,底层实现原理,其实是这样的。

public static io.github.yehongzhi.user.redisLock.Season[] values();

    Code:

       0: getstatic     #1                  // Field $VALUES:[Lio/github/yehongzhi/user/redisLock/Season;

       3: invokevirtual #2                  // Method "[Lio/github/yehongzhi/user/redisLock/Season;".clone:()Ljava/lang/Object;

       6: checkcast     #3                  // class "[Lio/github/yehongzhi/user/redisLock/Season;"

       9: areturn

以上就是java枚举的原理分析,希望能对大家有所帮助更多Java学习指路:Java基础

以上是 java枚举的原理分析 的全部内容, 来源链接: utcz.com/z/543559.html

回到顶部