2

大概整个方法体都被处理并转换为InsnList包含一堆AbstractInsnNodes 以及一些非字节码节点(如FrameNodeLineNumberNode等)的方法体。XXXNode 类 javadoc 通常包含一些有用的信息(例如,哪些操作码映射到此 XXXNode)但映射似乎并不完整,所以我不完全确定在所有情况下会发生什么:

  • WIDE字节码会发生什么?它会自动折叠到下一条指令中吗?大概是这样,但我找不到任何明确说明的内容
  • 是否所有 Ldc 指令 ( LDC, LDC_2, LDC_2W) 都映射到 LdcInsnNodes?大概是这样,但文档没有说

一般来说,有没有方便的java字节码-> ASM类的映射?我正在对 java 字节码序列(即方法体)进行一些处理,并想检查我可能收到的所有字节码(大约 200 个左右)是否映射到我正在正确处理的 ASM 数据结构。

4

1 回答 1

2

是的,你是正确的 LDC 指令和 WIDE。

ASM 没有将 Java 字节码中的操作码映射到org.objectweb.asm.Opcodes接口的 Java-doc ( http://asm.ow2.org/asm40/javadoc/user/index.html )中提到的 API

public interface Opcodes

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

这会转化为 ASM 中的其他 API。

这也可以在这里确认:

首先请注意,ASM 不提供与原始字节码的精确一对一映射... - http://osdir.com/ml/java.objectweb.asm/2008-03/msg00031.html

对于您问题的第二部分,您可以尝试使用常见问题解答中提到的 ASMifer:http ://asm.ow2.org/doc/faq.html#Q10 。它基本上会列出您必须使用 ASM 调用以创建给定字节码指令序列的 Java 指令。

于 2013-02-22T19:10:32.610 回答