自己手动写Java虚拟机-第3章 解析Class文件
本文默认Java版本为8.0
1 | ClassFile { |
u1: 1字节无符号整数
u2: 2字节无符号整数
u4: 4字节无符号整数
JVM解析class文件,获取上述信息,如图所示
魔数
class文件规定以0xCAFEBABE开头
版本号
Java版本号 M.m, M为主版本号, m为次版本号
类访问标志
16位bitmask, 指出class文件定义的是类还是接口,访问级别是public还是private.
类和超类索引
superClass只在Object.class中为0, 其他class文件中为常量池索引
接口索引表
字段和方法表
1 | field_info { |
解析常量池
常量池存放各种信息,每种常量格式也不同,结构如下,tag用来区分常量类型
1 | cp_info { |
14中常量类型
1 | const ( |
class文件中以MUTF-8(Modified UTF-8)方式编码,与UTF-8编码方式差别在于:
1.null字符(代码点 U+0000)会被编码成2字节
2.补充字符(Supplementary Characters,代码点大于U+FFFF的Unicode字符)按UTF-16拆分为代理对(Surrogate Pair)分别编码
解析属性表
1 | attribute_info { |
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.