• 技术文章 >java >java基础

    java枚举的原理分析

    小妮浅浅小妮浅浅2021-04-26 10:06:36原创2938

    本教程操作环境: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枚举
    上一篇:java枚举自带的方法有哪些 下一篇:java枚举实现单例的方法

    相关文章推荐

    • Java编写超时工具类• java之jvm两种存储区的类型• java中如何封装JDBC工具类• java数组元素的引用• Java构建JDBC应用程序的操作• java枚举自带的方法有哪些

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网