第 2 章:深入理解 Class 文件格式
本文最后更新于:1 年前
该章内容与《深入理解 Java 虚拟机 - 第 6 章:类文件结构》
https://weichao.io/816ce5c0985c
内容基本一致,篇幅更短,去掉了指令的分类,但添加了两个具体例子说明了指令的格式和用法。
invokevirtual 指令[1]:
- 规范
未完整截取 Description 的内容
: - 操作
看 Operation
:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派)。 - 指令格式
看 Format,描述了该指令的字节码值以及紧跟其后的参数
:- 字节码值
看 Forms
:0xb6 - 参数
一看 Format 字节码后的内容,二看 Description
:(indexbyte1 << 8) | indexbyte2 共同组成一个指向常量池的索引,该索引对应的常量项是 Methodref,Methodref 描述了这个方法的信息属于哪个类,以及该方法的 Method Descriptor 等
,解析这个信息可得到方法调用时需要多少个参数。如此,JVM 才能决定操作数栈中有多少项需要在这次 invokevirtual 时用到。
- 字节码值
- 操作数栈
看 Operand Stack,描述了该指令执行前后操作数栈的变化情况
:- 第一行
表示该指令执行前,操作数栈里应该放什么内容
:- 栈顶的增长方向
看箭头符号
:栈顶在最右边,栈底在最左边。arg2 位于栈顶。
- 栈顶的增长方向
- 第二行
表示该指令执行后,对操作数栈的影响
:- …
省略号,表示该指令执行完后对栈没有影响
- …
- 第一行
dup_x1 指令[2]:
- 规范:
- 操作:复制栈顶元素的值,并插入离栈顶两个距离的位置。
- 指令格式:
- 字节码值:0x5a
- 参数:无参数
- 操作数栈:
- 第一行:
- 栈顶的增长方向:栈顶在最右边,栈底在最左边。
- 元素:value2、value1
- 第二行:
- 栈顶元素 value1 被复制一份,插入 value2 之下。
- 第一行:
TODO:自行用 Java 编写一个 Class 文件解析程序
- 图 2-1 中 Class 文件的所有格式能正确识别。
- 常量池内容能全部解析。
- 属性只需解析本章介绍的这几种。
- 能解析 Code 属性中 code 数组里的指令码和参数。
参考
第 2 章:深入理解 Class 文件格式
https://weichao.io/500af8156fd5/