第 2 章:深入理解 Class 文件格式

本文最后更新于:1 年前

该章内容与《深入理解 Java 虚拟机 - 第 6 章:类文件结构》
https://weichao.io/816ce5c0985c
内容基本一致,篇幅更短,去掉了指令的分类,但添加了两个具体例子说明了指令的格式和用法。

invokevirtual 指令[1]

  • 规范未完整截取 Description 的内容
  • 操作看 Operation:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派)。
  • 指令格式看 Format,描述了该指令的字节码值以及紧跟其后的参数
    • 字节码值看 Forms0xb6
    • 参数一看 Format 字节码后的内容,二看 Description:(indexbyte1 << 8) | indexbyte2 共同组成一个指向常量池的索引,该索引对应的常量项是 Methodref,Methodref 描述了这个方法的信息属于哪个类,以及该方法的 Method Descriptor 等,解析这个信息可得到方法调用时需要多少个参数。如此,JVM 才能决定操作数栈中有多少项需要在这次 invokevirtual 时用到。
  • 操作数栈看 Operand Stack,描述了该指令执行前后操作数栈的变化情况
    • 第一行表示该指令执行前,操作数栈里应该放什么内容
      • 栈顶的增长方向看箭头符号:栈顶在最右边,栈底在最左边。arg2 位于栈顶。
    • 第二行表示该指令执行后,对操作数栈的影响
      • 省略号,表示该指令执行完后对栈没有影响

dup_x1 指令[2]

  • 规范:
  • 操作:复制栈顶元素的值,并插入离栈顶两个距离的位置。
  • 指令格式:
    • 字节码值:0x5a
    • 参数:无参数
  • 操作数栈:
    • 第一行:
      • 栈顶的增长方向:栈顶在最右边,栈底在最左边。
      • 元素:value2value1
    • 第二行:
      • 栈顶元素 value1 被复制一份,插入 value2 之下。

TODO:自行用 Java 编写一个 Class 文件解析程序

  • 图 2-1 中 Class 文件的所有格式能正确识别。
  • 常量池内容能全部解析。
  • 属性只需解析本章介绍的这几种。
  • 能解析 Code 属性中 code 数组里的指令码和参数。

参考


第 2 章:深入理解 Class 文件格式
https://weichao.io/500af8156fd5/
作者
魏超
发布于
2023年2月13日
更新于
2023年2月16日
许可协议