【问题标题】:ASM bytecode manipulation - istore and istore_<n>ASM 字节码操作 - istore 和 istore_<n>
【发布时间】:2014-10-06 21:37:22
【问题描述】:

正如documentation 所说:

公共接口操作码

定义 JVM 操作码、访问标志和 数组类型代码。 这个接口没有定义所有的JVM操作码 因为一些操作码是自动处理的。例如,xLOAD 和 xSTORE 操作码自动被 xLOAD_n 和 xSTORE_n 替换 尽可能使用操作码。 因此,xLOAD_n 和 xSTORE_n 操作码是 未在此接口中定义。同样对于 LDC,自动 必要时替换为 LDC_W 或 LDC2_W,WIDE、GOTO_W 和 JSR_W。

问题:

如果我有两个几乎相同的 .class 文件 - 一个使用 istore_&lt;n&gt; 和一个使用显式操作数的 istore。 Asm 将始终告诉(ClassReader 和 ClassVisitor)存在带有显式操作数的 istore。我想使用 asm,但我需要了解这些差异。使用 asm 可以获得任何指令的真实操作码吗?

【问题讨论】:

  • 你可以使用不同的库。

标签: java jvm bytecode java-bytecode-asm


【解决方案1】:

ASM 的 ClassWriter 将尽可能使用最有效的 ISTORE 操作码。如果输出 ISTORE 1,ASM 将输出 ISTORE_1。

因此,ClassReader 会将操作码“解构”为通用形式,隐藏其原始形式。通常可以安全地假设 ISTORE 1 最初是 ISTORE_1,但在其他情况下,原始字节码的实际形式会被 ASM 丢失。如果您想按原样检查原始字节码,您可能需要使用 javassist 。

【讨论】:

  • 是的,但我需要构建软件,例如显示两个类之间的差异(甚至一个类使用 istore_1 和一个 istore 1 的差异)
  • 使用 Javassist API,您可以获得一个 CodeIterator 对象。这允许您一次单步执行一条指令的代码。您将按顺序获取每个操作码,但必须“手动”读取操作码参数。这是一个低得多的 API。 ASM 是一种更易于使用的 API,但它隐藏了某些细节以保持有用的抽象。
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多