java枚举的原理分析

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

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

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

Seasonextendsjava.lang.Enum<Season>

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

static{};
descriptor:()V
flags:ACC_STATIC
Code:
stack=4,locals=0,args_size=0
0:new#4//classio/github/yehongzhi/user/redisLock/Season
3:dup
4:ldc#7//StringSPRING
6:iconst_0
7:invokespecial#8//Method"<init>":(Ljava/lang/String;I)V
10:putstatic#9//FieldSPRING:Lio/github/yehongzhi/user/redisLock/Season;
13:new#4//classio/github/yehongzhi/user/redisLock/Season
16:dup
17:ldc#10//StringSUMMER
19:iconst_1
20:invokespecial#8//Method"<init>":(Ljava/lang/String;I)V
23:putstatic#11//FieldSUMMER:Lio/github/yehongzhi/user/redisLock/Season;
26:new#4//classio/github/yehongzhi/user/redisLock/Season
29:dup
30:ldc#12//StringAUTUMN
32:iconst_2
33:invokespecial#8//Method"<init>":(Ljava/lang/String;I)V
36:putstatic#13//FieldAUTUMN:Lio/github/yehongzhi/user/redisLock/Season;
39:new#4//classio/github/yehongzhi/user/redisLock/Season
42:dup
43:ldc#14//StringWINTER
45:iconst_3
46:invokespecial#8//Method"<init>":(Ljava/lang/String;I)V
49:putstatic#15//FieldWINTER:Lio/github/yehongzhi/user/redisLock/Season;
52:iconst_4
53:anewarray#4//classio/github/yehongzhi/user/redisLock/Season
56:dup
57:iconst_0
58:getstatic#9//FieldSPRING:Lio/github/yehongzhi/user/redisLock/Season;
61:aastore
62:dup
63:iconst_1
64:getstatic#11//FieldSUMMER:Lio/github/yehongzhi/user/redisLock/Season;
67:aastore
68:dup
69:iconst_2
70:getstatic#13//FieldAUTUMN:Lio/github/yehongzhi/user/redisLock/Season;
73:aastore
74:dup
75:iconst_3
76:getstatic#15//FieldWINTER:Lio/github/yehongzhi/user/redisLock/Season;
79:aastore
80:putstatic#1//Field$VALUES:[Lio/github/yehongzhi/user/redisLock/Season;
83:return

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

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

publicstaticio.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
原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容