类文件结构

来源:互联网 发布:淘宝潮流社区怎么申请 编辑:程序博客网 时间:2024/06/05 08:47

参考《深入理解Java虚拟机》


class文件格式采用类似C语言结构体的伪结构来存储,只有两种数据类型:无符号数和表

1、无符号数:用u*来表示,比如u1,u2,u4,u8.“*“代表字节数。他可以描述数字、索引引用,数量值,或者按UTF8编码的字符串。【可见无符号数里面的数不是指数字,而是一种所占字节数的表示形式,书中叫他类型,感觉就像int byte等一样看待】
2、表:由多个无符号数或其他表作为数据项的复合数据类型,所有表习惯用“_info”结尾。【归根到底表也是由无符号数组成】

class的结构不像xml,xml可以随意定义类型的名称,但是class文件所有数据项都是固定的,包括顺序、长度等等

1、魔数

每个class文件的头4个字节成为魔数(Magic Number),作用是用于确定该class文件是否可以被虚拟机接受,即文件的类型,你是表示class文件还是GIF文件。该值16进制表示为为0xCAFEBABE,传说是个咖啡品牌的名字。

2、class文件的版本

紧接着魔数的4个字节存储的是class文件的版本号:第4、5个字节为次版本号,第6、7个字节为主版本号。根据版本号就可以知道虚拟机的支持情况.比如:00 00 34 00,前两位00 34转为16进制就是3*16+4=52,Java版本是从45开始,52-45+1=8,所以就是jdk8。有个简单的方法,3+4+1=8,再比如00 32 00 35,3+2+1=6,jdk6.【转为16进制查看】。除了16进制方式查看,也可以通过javap -verbose ClassName来查看!

3、常量池

1、版本号后跟着常量池入口,常量池是class文件结构中与其他项目关联最多的数据类型,也是文件中第一个出现的表类型数据项目。因为常量的数量是不固定的,所以在常量池的入口需要放置一个u2类型的数据来表示常量池的容量。用第8、9个字节个字节0x 0016,十进制表示为22,代表常量池中有21项常量。
2、常量池包括两大类:字面量和符号引用【所谓引用,就得有索引值,也就是偏移量】,可以简单理解为常量和引用。字面量相当于常量概念,如文本字符串,用final修饰的常量值等。符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。当虚拟机运行时,需要从常量池中获取对应的符号引用。
常量池的项目类型有11种,每一种首位都有一个u1类型的标示位,如CONSTANT_UTF8_INFO、CONSTANT_CLASS_INFO等等,前者表示UTF-8编码的字符串,后者为类或接口的符号引用,他们在class文件中用约定好的数字表示。如07 00 02,其中07(标示位)代表类或接口的符号引用,该符号引用的结构为“标示位+索引”,再跟进0x0002偏移量定位具体地址。也可以通过javap -verbose ClassName来查看常量池的具体内容!

0 0
原创粉丝点击