字节码的知识网络体系
字节码有啥用呢?知道了字节码之后你会看到更广阔的天地。
作为一个只会敲代码的打工人,你可能只会写java代码,但是知其然而不知其所以然也。
大人,时代已经变了,曾经修个电脑就能上班的年代已经一去不复返。
如果卷不动别人,就要被人卷。
知识体系
我们都知道java的出现是围绕着一个愿景的:
一个代码写一遍,到处运行,因为那个年代不同的os上的底层的指令集是可能不一样的,这样子可就为难程序员了,同样的逻辑要写好几便。我们it领域解决问题都可以用分层的方式解决,一层不够那就再加一层,TCP就是这么弄出来的。
java领域呢,也抽象出来了一层,往下屏蔽os,往上就可以进行统一化了,真正的实现,write one time,run everywhere。
java领域被抽象出来的东西就是JVM,而和jvm本身对接的东西我们称为字节码。
而java代码是更高的一层抽象,这一层屏蔽语言本身。类似于scala,groove,kotlin都可以运行在jvm上,这就是屏蔽了语言的好处。
那么我们理一理,java从书写到运行的整个流程。
开发的人根据java语言规范编写 .java代码 -> jdk自带指令javac 进行编译,生成jvm识别的.class文件 -> 运行 java 指令将刚刚写的代码跑起来,之后就是jvm的领域了。
那么从上面的图中,我们就能看出来,理解字节码本身好处颇多。你可以知道你平时写java的背后都有些什么,有了这个基础之后,每行代码是怎么运行的,也是可以脑补出来的。同时思想上的补充也会弥补以前对jvm本身的认知。
知识点
- Class文件结构
- 从字节码角度看java代码
- 基本数据类型与运算符操作
- 流程控制
- 对象初始化
- 方法调用与多态原理
- 异常捕获与处理
- 并发关键字
- 字节码改写框架
- agent寄生插件
既然我们要深究字节码,那自然是需要知道字节码的结构的,在class文件结构设计上,你会学到很多思想
- 如何最小化表达大量信息
- 如何制造出一个稳定的,可支持扩展的文件格式
- 知道如何制造出可以尽可能向下兼容的字节码文件
之后我们就可以和java语言本身做一个对照,看看我们平时的java代码背后都发生了些什么,学的够深了,写起代码来就如有神灵加持。
字节码在一定程度上为开发的人开放了一个口子——在运行态动态修改字节码,完成一个又一个黑科技。skywalking就是这么来的,它相当于是在jvm最上面做了一个代理。背后用的就是agent插件,伴随着jvm运行而运行,因此叫做插件。插件的附着方式可以使用java运行指令携带,也可以使用socket连接,这就是arthas的连接方式。jdk里面的instrument包就是专门干这个事儿的。
因此,如果要玩这么一整套东西,就必须知道字节码指令本身,改写字节码可以借助与框架的力量,毕竟字节码的确复杂。那么这个改写字节码的框架的api就要尽可能熟悉。字节码改写框架又会有很多,挑一个自己熟悉的就可以。
逻辑上,如果要一个闭环,那么就需要知道class是怎么产生的,class文件是怎么在jvm里面运行的。
前者需要知道编译原理,再细节一点就是javac的编译原理,后者就更复杂了,需要知道jvm领域的大量知识进才能把这部分的知识产生一个闭环。
就是肝,不带怕的。跪着也要舔完。