Class字节码

JVM与平台无关性是建立在操作系统上的,JVM提供各种操作系统的虚拟机,它们都可以加载和执行字节码,从而实现程序的一次编译到处执行。各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——-字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础。JVM虚拟机不只是运行java程序,它只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了java虚拟机指令集和符号表以及若干其他辅助信息。
image.png

Class类文件

Class文件是一组以8位(bite)为1字节(byte)为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个位以上空间的数据项时,则会按照高位在前的方式分割成若干个8位进行存储。一般来说一个Class文件都对应着唯一的一个类或接口的定义信息。
用16进制方式(因为一个16进制数可以通过4位来表示,一个字节8位可以表示二个16进制数)打开一个class文件如下图:
image.png

Class文件结构组成

既然class文件要被虚拟机所理解,那么肯定class文件的结构必须固定,class文件按如下图结构排列。
结构如下图:
image.png
class文件中的内容按上图严格排列,其中类型u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节。_info则表示有层次关系的复合结构的数据,每一种都有独立的结构,在每种数据的第一步都会标记占用的字节数。
解析过程如下:
1、文件第一个结构是u4、magic,表示占用4个字节,表达文件的魔数。如上图内容部分前4个字节是“CA FE BA BE”,翻译过来就是咖啡宝贝,这是固定表示是class文件,就像png图片文件的前几个字节码一样,是作为表示的存在。
2、4个字节读取完成后表示magic这个结构完成,接下来开始下一个u2、minor_version,表示接下来的两个字节表示的是minor_version,不过这个字段好像一直没有使用,一直是0000。
3、minor_version后面紧接着的是u2、major_version,表示接下来两个字节表达的是major_version代表的是jdk的主版本,上图的值是“00 34”转成十进制就是3
16+4=52,表示jdk8。jdk1.1对应的是45,1.2对应46,依次类推1.8对应52。如果执行class文件jvm的jdk版本低于编译class文件的jdk版本就会报错。比如:Unsupported major.minor version 52.0错误。

类文件的解析就像这样按结构和结构占用的字节一段一段的分析。

问题一: class文件内部结构组成

class文件是给JVM看的字节码文件,所以内部主要包含了符合JVM规范的字节码信息,该文件从头到尾依次大概包括的信息为:魔数、主次版本号、概括常量池的信息(常量个数、常量池表)、概括类本身的元信息(访问标记符号、类型、父类名、接口数、接口名称)、概括类内字段的信息(字段数、字段表)、概括方法的信息(方法个数、方法表)、其他附加信息。

问题二:说一下常量池类型分类

我们的常量池可以看作我们的java class类的一个资源仓库(比如Java类定的方法和变量信息),我们后面的方法类的信息的描述信息都是通过索引去常量池中获取。
常量池中主要存放两种常量,一种是字面量 一种是符号引用
image.png
image.png
他们的关系是,符号引用会类似指针一样,指向字面量。字面量包括文本字符串、被声明为final的常量值、基本数据类型等;符号引用包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。