自己手动写Java虚拟机-第3章 解析Class文件

Kelvin

本文默认Java版本为8.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ClassFile {
u4 magic; //cafebabe
u2 minor_version; //次版本号
u2 major_version; //主版本号
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]; 属性信息
}

u1: 1字节无符号整数
u2: 2字节无符号整数
u4: 4字节无符号整数
JVM解析class文件,获取上述信息,如图所示
解析class文件

魔数

class文件规定以0xCAFEBABE开头

版本号

Java版本号 M.m, M为主版本号, m为次版本号

类访问标志

16位bitmask, 指出class文件定义的是类还是接口,访问级别是public还是private.

类和超类索引

superClass只在Object.class中为0, 其他class文件中为常量池索引

接口索引表

字段和方法表

1
2
3
4
5
6
7
field_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}

解析常量池

常量池存放各种信息,每种常量格式也不同,结构如下,tag用来区分常量类型

1
2
3
4
cp_info {
u1 tag;
u1 info[];
}

14中常量类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const (
CONSTANT_Class = 7
CONSTANT_Fieldref = 9
CONSTANT_Methodref = 10
CONSTANT_InterfaceMethodref = 11
CONSTANT_String = 8
CONSTANT_Integer = 3
CONSTANT_Float = 4
CONSTANT_Long = 5
CONSTANT_Double = 6
CONSTANT_NameAndType = 12
CONSTANT_Utf8 = 1
CONSTANT_MethodHandle = 15
CONSTANT_MethodType = 16
CONSTANT_InvokeDynamic = 18
)

class文件中以MUTF-8(Modified UTF-8)方式编码,与UTF-8编码方式差别在于:
1.null字符(代码点 U+0000)会被编码成2字节
2.补充字符(Supplementary Characters,代码点大于U+FFFF的Unicode字符)按UTF-16拆分为代理对(Surrogate Pair)分别编码

解析属性表

1
2
3
4
5
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}

Java虚拟机规范定义了23中属性可分为三组,第一组为Java虚拟机所必需的,共有5种,第二组为Java类库所必需的,共有12种,第三组为工具使用,共有6种,详情可见《Java虚拟机规范》 .

  • Title: 自己手动写Java虚拟机-第3章 解析Class文件
  • Author: Kelvin
  • Created at: 2023-01-19 00:00:00
  • Updated at: 2023-05-11 21:41:51
  • Link: https://yanwc.com/2023/01/19/2023-01-19-jvmgo-ch03/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
自己手动写Java虚拟机-第3章 解析Class文件