参考文献:
https://blog.csdn.net/bjweimengshu/article/details/100718955?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242
java代码运行于JVM中,而jvm要运行java代码首先要做的就是加载字节码,也就是.java文件经过编译变成的.class文件。jvm运行的指令就是.class字节码。所以通过学习字节码的规范和规则能提升我们对代码执行过程的理解。
这里恶补一下字节码相关的基础知识。
我们打开.class文件,发现字节码都是十六进制的编码。
字节码的组成有以下部分,正入上图所示,十六进制的字节码中就包含这些部分 。如下图所示。
1.魔数:如图所示,cafebabe就是java字节码的魔术,这个数字是用java之父,詹姆斯高斯林指定的,其含义 就是java的咖啡bean吧。
2.版本号:因为java有不同的版本,所以在java字节码中也有标记。0000 0034两个字节就表示java1.8版本。
3.常量池:在java代码中一般会有很多常量,比如我们System.out.println(”ok”),这里用引号写死在代码 中的就是常量。java在编译的时候就会将这些常量罗列出来,形成常量池。在调用的时候从常量池中获取这些值。因为对于代码而言,常量的数量是可以确定的,所以这块常量池用了一个字节来表示常量池的大小。这里的0027就表示该类中常量的个数。这里表示39,扣除本身,这里表示有38个常量。如下图所示即是该类的常量。
对于这些常量,都用过一种数据结构进行保存。tag+length+data。也就是识别符号+数据长度+真实的数据的方式。比如这里
01 0001 01表示tag为1,长度为1,值为1的常量。这里的表示的常量Constant_utf8_info.这里我们知道常量池主要存储一些常量。下图为java的常量和相关的tag、length以及data的说明。
4.访问标志ÿ