JVM探索

小白懂JVM系列-class文件结构

2021-03-19  本文已影响0人  余生爱静

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
  1. 每个Class文件的头4个字节称为魔数(Magic Number)
  2. 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
  3. Class文件魔数的值为0xCAFEBABE。如果一个文件不是以0xCAFEBABE开头,那它就肯定不是Java class文件

minor_version(副版本)

image.png

major_version(主版本)

image.png

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


image.png
image.png

constant_pool_count(常量池数量)

image.png
image.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.png
0A为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.png
09对应的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.png
image.png
CONSTANT_Class_info
image.png
00 20=2x16=32
image.png

4、常量池info

image.png
0A=10,表示为CONSTANT_Methodref
00 03=3,表示为u2 class_index
image.png
00 1D=16+13=29,表示索引为29的常量池数据
image.png

5、常量池info

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

6、常量池info

image.png
0A表示为CONSTANT_Methodref_info
00 03表示常量池索引为3的:
image.png
00 22表示常量池所以为34的:
image.png

7、常量池info

image.png
09:CONSTANT_Fieldref_info
00 0B=11
image.png

00 23=32+3=35

image.png
image.png

8、常量池info

image.png
0A:CONSTANT_Methodref
00 03

00 24=36
image.png

9、常量池info

image.png
0A:CONSTANT_Methodref
00 25=37
00 26=38
image.png
常量池的结尾:
image.png

access_flags:访问权限标识

image.png

this_class

image.png
00 0B=11
image.png

super_class:父类名

image.png
00 0C=12
image.png

interfaces_count接口的数量

image.png
00 00=0,说明没有接口

u2 fields_count:字段数量

image.png
00 01表示有一个字段,在类中定义了一个字段
image.png
如果我们在类中定义两个字段:
image.png
image.png

field_info的结构:

image.png
image.png

第一个字段信息

00 09为access_flag,即0008+0001=0009(public static

image.png
00 10为name_index=16
image.png
00 11为descriptor_index=17
image.png
00 00\color{red}{attributes_count},没有数据

第二个字段信息

image.png
00 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_flags
image.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文件结构分析完毕。

上一篇下一篇

猜你喜欢

热点阅读