小白懂JVM系列-class文件结构
class文件架构-官方图
image.png分条解析class文件结构
u4 magic:class文件的魔数
u2 minor_version:jdk的副版本号
u2 major_version:jdk的主版本号
u2 constant_pool_count:常量池数量
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]:属性具体信息
Talk is cheap,Show me the code!
先展示一下java文件内容
image.png
再展示一下16进制的class文件
image.png
magic(魔数)
image.png- 每个Class文件的头4个字节称为魔数(Magic Number)
- 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
- Class文件魔数的值为0xCAFEBABE。如果一个文件不是以0xCAFEBABE开头,那它就肯定不是Java class文件
minor_version(副版本)
image.pngmajor_version(主版本)
image.png0X0034转化为十进制:3*16+4=52,52即对应着的jdk的版本为8,我目前使用的jdk版本既是1.8版本的。
image.png
image.png
constant_pool_count(常量池数量)
image.pngimage.png
image.png
16进制数0x0034转化为10进制:3*16+4=52,即表示该class文件常量池数量有52个,但是由于class文件的常量池数量是从1开始的,所以有51个。
constant_pool(常量池)
常量池的格式为:
image.png
tag的说明
常量池的tag总共有17中,具体如下表格
image.png
image.png
image.png
image.png
1、常量池info
image.png0A为tag内容,0A即为10,对应的tag内容为CONSTANT_Methodref_info,而CONSTANT_Methodref_info的数据结构为:第一字节u1为tag,后面两个字节u2为类在常量池的索引,而接着的两字节u2为名称和类型在常量池的索引。
00 0C即为12
image.png
00 1D即为16+13=29
image.png
2、常量池info
image.png09对应的tag为CONSTANT_Fieldref
image.png
CONSTANT_Fieldref的数据格式
image.png
image.png
00 1E=16+14=30,表示常量池索引为30的数据:
image.png
00 1F=16+15=31表示常量池索引为31的数据:
image.png
3、常量池info
image.pngimage.png
CONSTANT_Class_info
image.png
00 20=2x16=32
image.png
4、常量池info
image.png0A=10,表示为CONSTANT_Methodref
00 03=3,表示为u2 class_index
image.png
00 1D=16+13=29,表示索引为29的常量池数据
image.png
5、常量池info
image.png08,表示为 CONSTANT_String_info
00 21=2x16+1=33,表示索引为33的常量池数据
image.png
6、常量池info
image.png0A表示为CONSTANT_Methodref_info
00 03表示常量池索引为3的:
image.png
00 22表示常量池所以为34的:
image.png
7、常量池info
image.png09:CONSTANT_Fieldref_info
00 0B=11
image.png
00 23=32+3=35
image.png
8、常量池info
image.png0A:CONSTANT_Methodref
00 03
00 24=36
image.png
9、常量池info
image.png0A:CONSTANT_Methodref
00 25=37
00 26=38
image.png
常量池的结尾:
image.png
access_flags:访问权限标识
image.pngthis_class
image.png00 0B=11
image.png
super_class:父类名
image.png00 0C=12
image.png
interfaces_count接口的数量
image.png00 00=0,说明没有接口
u2 fields_count:字段数量
image.png00 01表示有一个字段,在类中定义了一个字段
image.png
如果我们在类中定义两个字段:
image.png
image.png
field_info的结构:
image.pngimage.png
第一个字段信息
00 09为access_flag,即0008+0001=0009(public static)
00 10为name_index=16
image.png
00 11为descriptor_index=17
image.png
00 00为,没有数据
第二个字段信息
image.png00 0A=10,即0008+0002=000A(private static)
image.png
00 12=18
image.png
00 11=17
image.png
00 00为attributes_count,没有数据
methods_count:方法数量(00 03)
方法数量method_info
method_info第一个method
1.1、access_flags
access_flagsimage.png
00 01表示该方法的访问级别为public
name_index:00 13=19
image.png
image.png
1.2、descriptor_index----00 14=20
1.3、attributes_count----00 01=1 参数数量为1
1.4、attributes----》属性的数据结构如下图
1.4.1、- u2 attribute_name_index
00 15=16+5=21
1.4.2、- u4 attribute_length
00 00 00 2F=2x16+15=47
第二个method
2.1、access_flags(00 09)
2.2、name_index(00 1A=16+10=26)
2.3、descriptor_index(00 1B=16+11=27)
2.4、attributes_count(00 01):属性的数量为1
attributes结构
attribute
2.4.1、 u2 attribute_name_index(00 15=16+5=21)
attribute_name
2.4.2、 u4 attribute_length(00 00 00 69=16x6+9=115)
第三个method 第三个method
3.1、access_flags(00 08=ACC_STATIC)
3.2、name_index(00 1E=16+14=30)
3.3、descriptor_index(00 14=16+4=20)
3.4、attributes_count(00 01)
3.4.1、attribute_name_index(00 15=16+5=21)
3.4.2、attribute_length(00 00 00 27=2*16+7=39)
attributes_count(00 01)
attribute_name_index(00 1F=16+15=31)
attribute_length(00 00 00 02)
至此,Class文件结构分析完毕。