小白懂JVM系列-class文件结构
class文件架构-官方图

分条解析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文件内容

再展示一下16进制的class文件

magic(魔数)

- 每个Class文件的头4个字节称为魔数(Magic Number)
- 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
- Class文件魔数的值为0xCAFEBABE。如果一个文件不是以0xCAFEBABE开头,那它就肯定不是Java class文件
minor_version(副版本)

major_version(主版本)

0X0034转化为十进制:3*16+4=52,52即对应着的jdk的版本为8,我目前使用的jdk版本既是1.8版本的。


constant_pool_count(常量池数量)



16进制数0x0034转化为10进制:3*16+4=52,即表示该class文件常量池数量有52个,但是由于class文件的常量池数量是从1开始的,所以有51个。
constant_pool(常量池)
常量池的格式为:

tag的说明
常量池的tag总共有17中,具体如下表格




1、常量池info

0A为tag内容,0A即为10,对应的tag内容为CONSTANT_Methodref_info,而CONSTANT_Methodref_info的数据结构为:第一字节u1为tag,后面两个字节u2为类在常量池的索引,而接着的两字节u2为名称和类型在常量池的索引。
00 0C即为12

00 1D即为16+13=29

2、常量池info

09对应的tag为CONSTANT_Fieldref

CONSTANT_Fieldref的数据格式


00 1E=16+14=30,表示常量池索引为30的数据:

00 1F=16+15=31表示常量池索引为31的数据:

3、常量池info


CONSTANT_Class_info

00 20=2x16=32

4、常量池info

0A=10,表示为CONSTANT_Methodref
00 03=3,表示为u2 class_index

00 1D=16+13=29,表示索引为29的常量池数据

5、常量池info

08,表示为 CONSTANT_String_info
00 21=2x16+1=33,表示索引为33的常量池数据

6、常量池info

0A表示为CONSTANT_Methodref_info
00 03表示常量池索引为3的:

00 22表示常量池所以为34的:

7、常量池info

09:CONSTANT_Fieldref_info
00 0B=11

00 23=32+3=35


8、常量池info

0A:CONSTANT_Methodref
00 03

00 24=36

9、常量池info

0A:CONSTANT_Methodref
00 25=37
00 26=38

常量池的结尾:

access_flags:访问权限标识


this_class

00 0B=11

super_class:父类名

00 0C=12

interfaces_count接口的数量

00 00=0,说明没有接口
u2 fields_count:字段数量

00 01表示有一个字段,在类中定义了一个字段

如果我们在类中定义两个字段:


field_info的结构:


第一个字段信息
00 09为access_flag,即0008+0001=0009(public static)

00 10为name_index=16

00 11为descriptor_index=17

00 00为
第二个字段信息

00 0A=10,即0008+0002=000A(private static)

00 12=18

00 11=17

00 00为attributes_count,没有数据
methods_count:方法数量(00 03)

method_info

第一个method
1.1、access_flags


00 01表示该方法的访问级别为public
name_index:00 13=19


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


2.4.1、 u2 attribute_name_index(00 15=16+5=21)

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文件结构分析完毕。