阅读《深入理解Java虚拟机》第2版,结合JDK8的读书笔记。当前文章为书本的第6章节。
6.1.概述
越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。
6.2.无关性的基石
- 平台无关性
各种不同平台的虚拟机与所有平台都统一使用的程序存储格式-字节码(ByteCode),是构成平台无关性的基石.
- 语言无关性
实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。
6.3.Class类文件的结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。根据java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有无符号数和表。
- 无符号数属于基本的数据类型,以u1,u2,u4,u8来代表1个字节,2个字节,4个字节和8个字节。
无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
- 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所以表都习惯性地以“_info”结尾。
表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。由以下表格所示的数据项构成。
类型 | 名称 | 数量 | 备注 |
---|---|---|---|
u4 | magic | 1 | 魔数值;Java文件为CAFEBABE |
u2 | minor_version | 1 | 此版本 |
u2 | major_version | 1 | 主版本;十进制45表示JDK1.1 |
u2 | constant_pool_count | 1 | 常量数 |
cp_info | constant_pool | constant_pool_count-1 | 常量池 |
u2 | access_flags | 1 | 访问标识 |
u2 | this_class | 1 | 当前类索引值 |
u2 | super_class | 1 | 当前类的父类索引值,Java单继承 |
u2 | interfaces_count | 1 | 当前类的接口数量值,Java多实现 |
u2 | interfaces | interfaces_count | 当前类的接口索引值 |
u2 | fields_count | 1 | 字段数量 |
field_info | fields | fields_count | 字段信息表 |
u2 | methods_count | 1 | 方法数量 |
method_info | methods | methods_count | 方法信息表 |
u2 | attributes_count | 1 | 属性数量 |
attribute_info | attributes | attributes_count | 属性信息表 |
6.3.1.魔数与Class文件的版本
- magic - u4
魔数(Magic-Number),用于确定该文件是否为一个能被虚拟机接受的class文件
很多文件存储标准中都用魔数来进行身份识别,如gif,jpeg都在文件头中存有魔数。JAVA的class文件魔数为CAFEBABE。
- minior_version - u2
次版本号
- major_version - u2
主版本号。
Java版本号从45开始。0x002D等同于十进制2*16+13=45,也就是JDK1
未完待续…