JVM浅析总结(Class文件结构)
# Class文件结构
java规范(语言规范和虚拟机规范)官方网站:https://docs.oracle.com/javase/specs/index.html (opens new window)
# class类的本质
任何一个Class 文件对应这唯一一个类或者接口的定义信息,class文件是一组以8位字节为基础单位的二进制流
# class文件格式
采用一种类似于C语言结构体的方式进行数据存储,数据中有两种数据类型:无符号数和表
类型 | 具体含义 |
---|---|
无符号数 | 属于基本数据类型,以u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数,无符号数可以用来描述数字,索引引用,数量值或者UTF-8编码构成字符串值 |
表 | 由多个无符号数或者其他作为数据项构成的复合数据类型,所有表都习惯性的以_info结尾,表用于描述有层次关系的复合结构的数据,整个Class文件本质就是一张表,由于表没有固定长度,所以通常会在其前面加上个数说明 |
class文件基本结构(官方文档地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html (opens new window))
ClassFile {
u4 magic; #魔数
u2 minor_version; #class文件次要版本号
u2 major_version; #class文件主要要版本号
u2 constant_pool_count; #常量池内部项目数量=constant_pool table +1
cp_info constant_pool[constant_pool_count-1]; #常量池结构表
u2 access_flags; #访问标识
u2 this_class; #当前类说明
u2 super_class; #父类说明
u2 interfaces_count; #接口数量
u2 interfaces[interfaces_count]; #接口数组
u2 fields_count; #字段数量
field_info fields[fields_count]; #字段数组
u2 methods_count; #方法数量
method_info methods[methods_count]; #接口数组
u2 attributes_count; #属性个数
attribute_info attributes[attributes_count]; #属性数组
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
类型 | 名称 | 说明 | 长度 | 数量 |
---|---|---|---|---|
u4 | magic | 魔数,识别class文件格式 | 四个字节 | 1 |
u2 | minor_version | class次版本号 | 两个字节 | 1 |
u2 | major_version | class主版本号 | 两个字节 | 1 |
u2 | constant_pool_count | 常量池计数器 | 两个字节 | 1 |
cp_info | constant_pool | 常量池表,存放编译生成的字面量和符号引用,通过类加载之后进入方法区的运行时常量池 | n个字节 | constant_pool_count-1 |
u2 | access_flags | 访问标识 | 两个字节 | 1 |
u2 | this_class | 类索引 | 两个字节 | 1 |
u2 | super_class | 父类索引 | 两个字节 | 1 |
u2 | interfaces_count | 接口计数器 | 两个字节 | 1 |
u2 | interfaces[interfaces_count] | 接口索引集合 | 两个字节 | 1 |
u2 | fields_count | 字段计数器 | 两个字节 | 1 |
field_info | fields[fields_count] | 字段表 | N个字节 | fields_count |
u2 | methods_count | 方法计数器 | 两个字节 | 1 |
method_info | methods[methods_count] | 方法表 | N个字节 | methods_count |
u2 | attributes_count | 属性计数器 | 两个字节 | 1 |
attribute_info | attributes[attributes_count] | 属性表 | N个字节 | attributes_count |
上次更新: 2023/12/18, 13:54:07