本文图片以及部分内容来自 Java字节码增强探秘。
Java字节码的介绍
字节码基础
.java文件通过javac编译后将得到一个.class文件,如下图所示,class文件中都是16进制数。
java字节码主要包括以下几部分。
(1)魔数,魔数固定的值是CAFEBABY,占用四个字节,用此来判断该文件是否可以被虚拟机所接收。我理解在类加载过程中,校验的第一步格式校验就是去校验魔数。
补充:为什么CA占一个字节呢,因为一个字节是8位01,而这个是16进制的,最大可以到15,15就是F,也就是1111,所以一个16进制数需要4位01来存储,因此两个16进制数就是一字节。
(2)版本数:紧接着魔数的后4位数就是版本数,虚拟机要求不能执行超过其版本号的class文件。
(3)常量池:常量池中存储的是字面量与符号引用。由于存储的数量不定,因此需要两字节来存储数量。常量池中存储与常规不同,它的存储是以1开始的,因此比如值为0x0016,对应22。常量池中有21个常量,其下标为1-21。
(4)访问标志:之后的两个字节表示访问标志,包括: 这个Class是类还