码迷,mamicode.com
首页 > 其他好文 > 详细

:Lother/BehaviorEn

时间:2020-06-12 14:42:54      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:rtu   java编译   lang   obj   日常   valueof   load   并且   匿名类   

枚举是我们日常开发经常用到的一个类型 , 比如说我们有个用户系统 , 那么我们怎么判断这个是一个我们的忠实用户或者说是一个忠实粉丝呢 ? 我们就定义如下的行为枚举

public enum BehaviorEnum {
/**
* 关注
*/
FOLLOW{
@Override
void action() {
System.out.println("我已经关注了 CoderLi 了");
}
},
/**
* 在看
*/
WOW{
@Override
void action() {
System.out.println("CoderLi 的文章我已经点在看了");
}
},
/**
* 分享
*/
FORWARD_TO_FRIENDS{
@Override
void action() {
System.out.println("CoderLi 的文章我已经分享给我的基友了");
}
},
/**
* 收藏
*/
ADD_TO_FAVORITES{
@Override
void action() {
System.out.println("CoderLi 的文章已经在我的收藏里面吃灰了");
}
},;

abstract void action();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
如果说这个用户都具备上面的四种行为的话、我们就认定这个用户是一个非常棒棒棒棒棒棒棒棒的用户(看到这里的你 , 还不懂我的暗示吗 ? 原创不易 , 希望得到各位的支持)

枚举是 JDK 1.5才开始支持的的、一开始是 Java是不支持枚举的,就像泛型一样,本质上来说它们都是语法糖。

那它究竟是如何实现的呢 ?

分析
我们先将上面的 BehaviorEnum.java编译成 class文件

 

哦吼、居然多出那么多匿名类,我们先来看看 BehaviorEnum.class里面有什么东东

我们看到 BehaviorEnum变成了一个 abstract class并且继承了 Enum这个类,并且在这个抽象类中定义了四个 static final类型为 BehaviorEnum的 变量

public abstract class other.BehaviorEnum extends java.lang.Enum<other.BehaviorEnum>
public static final other.BehaviorEnum FOLLOW;
descriptor: Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final other.BehaviorEnum WOW;
descriptor: Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final other.BehaviorEnum FORWARD_TO_FRIENDS;
descriptor: Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final other.BehaviorEnum ADD_TO_FAVORITES;
descriptor: Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
1
2
3
4
5
6
7
8
9
10
11
12
13
然后我们发现了多出了一个 public的静态方法 values

public static other.BehaviorEnum[] values();
descriptor: ()[Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #2 // Field $VALUES:[Lother/BehaviorEnum;
3: invokevirtual #3 // Method "[Lother/BehaviorEnum;".clone:()Ljava/lang/Object;
6: checkcast #4 // class "[Lother/BehaviorEnum;"
9: areturn
1
2
3
4
5
6
7
8
9
还多出了另一个 public的静态方法 valueOf

public static other.BehaviorEnum valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lother/BehaviorEnum;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: ldc #5 // class other/BehaviorEnum
2: aload_0
3: invokestatic #6 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #5 // class other/BehaviorEnum
9: areturn
1
2
3
4
5
6
7
8
9
10
一个 static块的初始化代码块

static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=4, locals=0, args_size=0
0: new #8 // class other/BehaviorEnum$1
3: dup
4: ldc #9 // String FOLLOW
6: iconst_0
7: invokespecial #10 // Method other/BehaviorEnum$1."<init>":(Ljava/lang/String;I)V
10: putstatic #11 // Field FOLLOW:Lother/BehaviorEnum;
13: new #12 // class other/BehaviorEnum$2
16: dup
17: ldc #13 // String WOW
19: iconst_1
20: invokespecial #14 // Method other/BehaviorEnum$2."<init>":(Ljava/lang/String;I)V
23: putstatic #15 // Field WOW:Lother/BehaviorEnum;
26: new #16 // class other/BehaviorEnum$3
29: dup
30: ldc #17 // String FORWARD_TO_FRIENDS
32: iconst_2
33: invokespecial #18 // Method other/BehaviorEnum$3."<init>":(Ljava/lang/String;I)V
36: putstatic #19 // Field FORWARD_TO_FRIENDS:Lother/BehaviorEnum;
39: new #20 // class other/BehaviorEnum$4
42: dup
43: ldc #21 // String ADD_TO_FAVORITES
45: iconst_3
46: invokespecial #22 // Method other/BehaviorEnum$4."<init>":(Ljava/lang/String;I)V
49: putstatic #23 // Field ADD_TO_FAVORITES:Lother/BehaviorEnum;
52: iconst_4
53: anewarray #5 // class other/BehaviorEnum
56: dup
57: iconst_0
58: getstatic #11 // Field FOLLOW:Lother/BehaviorEnum;
61: aastore
62: dup
63: iconst_1
64: getstatic #15 // Field WOW:Lother/BehaviorEnum;
67: aastore
68: dup
69: iconst_2
70: getstatic #19 // Field FORWARD_TO_FRIENDS:Lother/BehaviorEnum;
73: aastore
74: dup
75: iconst_3
76: getstatic #23 // Field ADD_TO_FAVORITES:Lother/BehaviorEnum;

:Lother/BehaviorEn

标签:rtu   java编译   lang   obj   日常   valueof   load   并且   匿名类   

原文地址:https://www.cnblogs.com/szgezg/p/13098897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!