1.Class
文件的本质和Class
文件的格式(无符号数和表)
- 任何一个
Class
文件都对应着一个类或者接口的定义信息,Class
文件不一定以磁盘文件的形式存在,它的本质是一组以8
位字节为基础单位的二进制流
,可以使用网络方式进行传播。 - 字节码文件的格式有着严格的规定,每个字节的顺序、代表的含义都不允许改变。
- Class文件采用类似于C语言结构体的方式进行存储,这种结构中只有两种数据类型:
无符号数和表
。
a)
无符号数属于基本数据类型,以u1、u2、u4、u8
分别代表1
个字节、2
个字节、4
个字节、8
个字节的无符号数。这些无符号数字可以用来表示各种意思。
b)
表是由多个无符号数或者其他表作为数据项构成的复合数据类型。表通常以_info
结尾,通常还会在前面加上一个数字表示表的长度。
2. Class文件的结构概述
Class
文件的结构不是一成不变的,随着JVM
的发展,总是不可避免的会做出一些调整,但是其基本的结构和框架是非常稳定的。Class
文件的总体结构如下:
1)
魔数 - 识别当前的文件是不是一个Class
文件
2)
Class
文件版本
3)
常量池
4)
访问标志
5)
类索引,父类索引,接口索引集合
6)
字段表集合
7)
方法表集合
8)
属性表集合 -
- 详细的
Class
文件的结构如下(了解):
类型 | 名称 | 说明 | 长度 | 数量 |
---|---|---|---|---|
u4 | magic | 魔数,识别Class文件格式 | 4个字节 | 1 |
u2 | minor_version | 副版本号(小版本) | 2个字节 | 1 |
u2 | major_version | 主版本号(大版本) | 2个字节 | 1 |
u2 | constant_pool_count | 常量池计数器 | 2个字节 | 1 |
cp_info | constant_pool | 常量池表 | n个字节 | constant_pool_count-1 |
u2 | access_flags | 访问标识 | 2个字节 | 1 |
u2 | this_class | 类索引 | 2个字节 | 1 |
u2 | super_class | 父类索引 | 2个字节 | 1 |
u2 | interfaces_count | 接口计数器 | 2个字节 | 1 |
u2 | interfaces | 接口索引集合 | 2个字节 | interfaces_count |
u2 | fields_count | 字段计数器 | 2个字节 | 1 |
field_info | fields | 字段表 | n个字节 | fields_count |
u2 | methods_count | 方法计数器 | 2个字节 | 1 |
method_info | methods | 方法表 | n个字节 | methods_count |
u2 | attributes_count | 属性计数器 | 2个字节 | 1 |
attribute_info | attributes | 属性表 | n个字节 | attributes_count |
3.Class
文件结构思维导图
更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html