那我们定义枚举类型后,到底发生了什么呢?我们对枚举的实现原理进行探究。
我们来解析下Color.class文件,命令javap Color
public final class Color extends java.lang.Enum {
public static final Color Red;
public static final Color Blue;
public static final Color Green;
public static final Color[] $VALUES;
public static Color[] values();
public static Color valueOf(java.lang.String);
static {};
}
从解析后的文件中我们可以知道
1.枚举类是final
的,不能被继承
2.枚举类在经过编译后生成一个继承java.lang.Enum
的类 Color
3.编译后的枚举值,是该类的Color类型的成员变量,如 Red、Bule、Green
,并且是final static
修饰
4.枚举编译后的类添加了静态的values()
和valueOf(java.lang.String)
方法
5.静态代码块static {}
进一步细化Color.class
命令javap -c Color
public final class Color extends java.lang.Enum {
public static final Color Red;
public static final Color Blue;
public static final Color Green;
public static Color[] values();
Code:
0: getstatic #1 // Field $VALUES:[LColor;
3: invokevirtual #2 // Method “[LColor;”.clone:()Ljava/lang/Object;
6: checkcast #3 // class “[LColor;”
9: areturn
public static Color valueOf(java.lang.String);
Code:
0: ldc #4 // class Color
2: aload_0
3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljav
a/lang/Enum;
6: checkcast #4 // class Color
9: areturn
static {};
Code:
0: new #4 // class Color
3: dup
4: ldc #7 // String Red
6: iconst_0
7: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
10: putstatic #9 // Field Red:LColor;
13: new #4 // class Color
16: dup
17: ldc #10 // String Blue
19: iconst_1
20: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
23: putstatic #11 // Field Blue:LColor;
26: new #4 // class Color
29: dup
30: ldc #12 // String Green
32: iconst_2
33: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
36: putstatic #13 // Field Green:LColor;
39: iconst_3
40: anewarray #4 // class Color
43: dup
44: iconst_0
45: getstatic #9 // Field Red:LColor;
48: aastore
49: dup
50: iconst_1
51: getstatic #11 // Field Blue:LColor;
54: aastore
55: dup
56: iconst_2
57: getstatic #13 // Field Green:LColor;
60: aastore
61: putstatic #1 // Field $VALUES:[LColor;
64: return
}
还原后的代码如下:
public final class Color extends java.lang.Enum {
//定义的枚举成员
public static final Color Red;
public static final Color Blue;
public static final Color Green;
//编译器自动生成的 javap -c 还查不出来,疑惑
public static final /* synthetic */ Color[] $VALUES;//编译器自动生成的
public static Color[] values(){
/**
-
0: getstatic #1 // Field $VALUES:[LColor;
-
3: invokevirtual #2 // Method “[LColor;”.clone:()Ljava/lang/Object;
-
6: checkcast #3 // class “[LColor;”
-
9: areturn
*/
return $VALUES.clone();
}
public static Color valueOf(java.lang.String s){
/**
-
0: ldc #4 // class Color
-
2: aload_0
-
3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljav
-
a/lang/Enum;
-
6: checkcast #4 // class Color
-
9: areturn
*/
return Enum.valueOf(Color.class,s);
}
protected Color(String name, int ordinal) {
super(name, ordinal);
}
static {
/**
-
0: new #4 // class Color
-
3: dup
-
4: ldc #7 // String Red
-
6: iconst_0
-
7: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
-
10: putstatic #9 // Field Red:LColor;
*/
Red=new Color(“Red”,0);
/**
-
13: new #4 // class Color
-
16: dup
-
17: ldc #10 // String Blue
-
19: iconst_1
-
20: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
-
23: putstatic #11 // Field Blue:LColor;
*/
Blue=new Color(“Blue”,1);
/**
-
26: new #4 // class Color
-
29: dup
-
30: ldc #12 // String Green
-
32: iconst_2
-
33: invokespecial #8 // Method “”:(Ljava/lang/String;I)V
-
36: putstatic #13 // Field Green:LColor;
*/
Green=new Color(“Green”,2);
/**
-
39: iconst_3
-
40: anewarray #4 // class Color
-
43: dup
-
44: iconst_0
-
45: getstatic #9 // Field Red:LColor;
-
48: aastore
-
49: dup
-
50: iconst_1
-
51: getstatic #11 // Field Blue:LColor;
-
54: aastore
-
55: dup
-
56: iconst_2
-
57: getstatic #13 // Field Green:LColor;
-
60: aastore
-
61: putstatic #1 // Field $VALUES:[LColor;
*/
$VALUES=new Color[]{Red,Blue,Green};
};
}
通过上面还原后的代码可知,在类的static代码块
中编译器帮我们生成枚举中的每个成员,实际上就是生成对象并赋值给静态变量。
枚举其实就是编译帮我们在静态代码块中创建一个或多个枚举成员对象,如果我们只定义一个枚举成员,这样就是一个单例对象
public enum Singleton {
INSTANCE;
public void doSometing(){
System.out.println(“doing”);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/508a2458afe1fd54f5ec8083def6e659.jpeg)
最后
既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?
就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。
如果觉得图片不够清晰,也可来找小编分享原件的xmind文档!
且除此份微服务体系大纲外,我也有整理与其每个专题核心知识点对应的最强学习笔记:
-
出神入化——SpringCloudAlibaba.pdf
-
SpringCloud微服务架构笔记(一).pdf
-
SpringCloud微服务架构笔记(二).pdf
-
SpringCloud微服务架构笔记(三).pdf
-
SpringCloud微服务架构笔记(四).pdf
-
Dubbo框架RPC实现原理.pdf
-
Dubbo最新全面深度解读.pdf
-
Spring Boot学习教程.pdf
-
SpringBoo核心宝典.pdf
-
第一本Docker书-完整版.pdf
-
使用SpringCloud和Docker实战微服务.pdf
-
K8S(kubernetes)学习指南.pdf
另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
o最新全面深度解读.pdf
-
Spring Boot学习教程.pdf
-
SpringBoo核心宝典.pdf
-
第一本Docker书-完整版.pdf
-
使用SpringCloud和Docker实战微服务.pdf
-
K8S(kubernetes)学习指南.pdf
[外链图片转存中…(img-EImI48wO-1713291745983)]
另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!
[外链图片转存中…(img-Rgp5qsFZ-1713291745983)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!