Class文件
Class文件是一组以8个字节为基础单位的二进制字节流。
各项数据会严格的按照顺序紧凑的排列在class文件中,中间没有分隔符,使得class文件存储的内容几乎全部都是程序运行的。
根据《JAVA虚拟机规范》规定,class文件格式采用的类似C语言的结构体的伪结构来存储的,这种结构只有两种数据类型。 无符号数和表。
无符号数
无符号数属于基本数据数据类型,以u1,u2,u4,u8代表一个字节,两个字节…的无符号数,无符号数可以用来描述数字,索引,数量值或者按照UTF-8编码构成的字符串值。
表
表由多个无符号数或者其他表作为数据项构成的复合数据类型。所有的表命名都习惯以_info结尾,表主要用于描述有层次关系的复合结构数据。 比如:方法、字段,需要注意的是class文件没有分隔符,所以每个二进制数据类型都是严格定义的。
整个Class文件本质上也可以视作是一张表。
Class文件的格式如下:
魔数
1 .每一个class文件的头4个字节 被称为魔数 magicNumber
2 . 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件
3. Class文件魔数值为0xCAFEBABE 如果以个文件不是以CAFEBABE开头,那么它就肯定不是java的class文件。
那么它也是java.class的识别魔数。
很多的文件存储标准中都使用魔数来识别文件的身份。 譬如图片格式.gif 或 jpeg等在文件的头部都存有魔数,使用魔数而不是文件的扩展名称来判断 ,这种情况是处于安全的考虑。
文件版本号
紧挨着魔数的4个字节存储的是Class文件的版本号:第五个和第六个字节是次版本号 --minor_version ,第七第八个字节是主版本号–major_version。
这个版本号随着jdk版本的不同而表示不同版本的范围。Java的版本号是从45开始的
如果class的版本号超过虚拟机的版本 会被拒绝执行。
JDK1.2 ----0X002E 46
JDK1.3 ----0X002F 47
JDK1.4 ----0X0030 48
JDK1.5 ----0X0031 49
JDK1.6 ----0X0032 50
JDK1.7 ----0X0033 51
JDK1.8 ----0X0034 52
下图可以清楚地看见开头4个字节的十六进制表示OxCAFEBABE,代表次版本号的第5个和第6个字节值为Ox0000,而主版本号的值为Ox0032,也即是十进制的50,该版本号说明这个是可以被JDK6或以上版本虚拟机执行的Class文件。
常量池
紧跟着魔数与版本号之后的是常量池入口,常量池简单理解为class文件的资源库。
- 它是class文件结构中与其他项目关联最多的数据类型
- 是占用class文件空