Class类文件结构


Class文件是一组以8位字节为基本单位的二进制流,二进制的存储格式和虚拟机是实现平台无关性的基石

class文件结构

只有两种数据结构,无符号数 和 表

无符号数是基本的数据类型,以u1,u2,u4,u8,分别表示1字节,2字节,4字节,8字节的无符号数

表是由多个无符号数,或者其他表构成的符合数据结构

class文件格式

类型名称数量描述
u4magic1魔数
u2minor_version1次版本
u2major_version1主版本
u2constant_pool_count1常量池容量
cp_infoconstant_poolconstant_pool_count -1常量池数据项列表
u2access_flags1访问权限
u2this_class1类全限定名
u2super_class1父类全限定名
u2interfaces_count1接口数量
u2interfacesinterfaces_count接口数据项列表
u2fiekds_count1字段数量
field_infofieldsfiekds_count字段数据项列表
u2methods_count1方法数量
method_infomethodsmethods_count方法数据项列表
u2attributes_count1属性数量
attribute_infoattributesattributes_count属性数据项列表
魔数和Class文件的版本
1. class文件的头4个字节称为魔数->0xCAFEBABE
2. 紧接着4位是class文件版本号,5,6字节此版本,7,8字节主版本,版本号从45开始
3. 再接着就是常量池入口,u2类型的常量池容量计数,后面再接着就是数据项
常量池主要存放两大类常量
(1).字面量[文本字符串,声明为final的常量值]
(2).符号引用[包括三大类常量,类和接口的全限定名,字段的名称和描述符,方法的名称和描述符,符号引用需要在运行期动态解析成直接引用,才可被虚拟机使用]
常量池

常量池的项目类型

类型标志描述
CONSTANT_Utf8_info1UTF-8编码的字符串
CONSTANT_Integer_info3整型字面量
CONSTANT_Float_info4浮点型字面量
CONSTANT_Long_info5长整型字面量
CONSTANT_Double_info6双精度浮点型字面量
CONSTANT_Class_info7类或接口的符号引用
CONSTANT_String_info8字符串类型字面量
CONSTANT_Fieldref_info9字段的符号引用
CONSTANT_Methodref_info10类中的方法的符号引用
CONSTANT_IntefaceMethodref_info11接口中的方法的符号引用
CONSTANT_NameAndType_info12字段和方法的部分符号引用
CONSTANT_MethodHandle_info15表示方法句柄
CONSTANT_MethodType_info16标识方法类型
CONSTANT_InvokeDynamic_info18表示一个动态方法调用点

常量池中的14种常量项的结构总表

下面描述的tag值统一都是u1

CONSTANT_Utf8_info

tag:1
length:u2 utf-8编码的字符串占用的字节数【最大 2^16bytes:u1,长度为length的utf-8编码的字符串,每个bytes长度为u1,共lengthbytes

说明:因为方法名,属性名,接口,类全限定名,都是CONSTANT_Utf8_info类型,
所以CONSTANT_Utf8_info所能表示的最大范围就是支持方法名,属性名,接口,类全限定名的最大范围,所以方法名,属性名,接口,类全限定名不能超过65535个字节的长度,
否则,虚拟机编译会出错,因为常量池CONSTANT_Utf8_info类型装不下

CONSTANT_Integer_info

tag:3
bytes:u4,按照高位在前存储的int值,2^32

CONSTANT_Float_info

tag:4
bytes:u4 按照高位在前存储的float

CONSTANT_Long_info

tag:5
bytes:u8 按照高位在前存储的long

CONSTANT_Double_info

tag:6
bytes:u8 按照高位在前存储的double

CONSTANT_Class_info

tag:7
index: u2 指向全限定名常量项的索引

CONSTANT_String_info

tag:8
index: u2 指向字符串字面量的索引

CONSTANT_Fieldref_info

tag:9
index:u2 指向声明字段的类或接口描述符CONSTANT_Class_info的索引项
index:u2 指向字段描述符CONSTANT_NameAndType_info的索引项

CONSTANT_Methodref_info

tag:10
index:u2  指向声明方法的类描述符CONSTANT_Class_info的索引项
index:u2  指向名称和类型描述符CONSTANT_NameAndType_info的索引项

CONSTANT_IntefaceMethodref_info

tag:11 
index:u2 指向声明方法的接口的描述符CONSTANT_Class_info的索引项
index:u2 指向名称和类型描述符CONSTANT_NameAndType_info的索引项

CONSTANT_NameAndType_info

tag:12
index:u2 指向该字段或方法名称常量项的索引
index:u2 指向该字段或方法描述符常量项的索引

CONSTANT_MethodHandle_info

tag:15
reference_kind:u1
reference_index:u2

CONSTANT_MethodType_info

tag:16
descriptor_index:u2

CONSTANT_InvokeDynamic_info

tag:18
bootstap_method_attr_index:u2
name_and_type_index:u2
访问标志

长度 u2

类索引
父类类索引
接口索引集合
字段表集合
方法表集合
属性表集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值