大概是整个方法体被处理,并在包含一堆InsnList
的{{1}}中转换,以及一些非字节码节点(如AbstractInsnNode
,{{1等等)。 XXXNode类javadoc通常包含一些有用的信息(例如哪些操作码映射到此XXXNode),但映射似乎不是完全的,所以我不完全确定在所有情况下会发生什么:
FrameNode
字节码会发生什么变化?是否会自动折叠到下一条指令中?据推测它确实如此,但我找不到任何明确说明LineNumberNode
,WIDE
,LDC
)都映射到LdcInsnNodes?据推测他们这样做,但文档没有说一般来说,是否有方便的java字节码映射 - > ASM课程?我正在对java字节码序列(即方法体)进行一些处理,并想检查我可能收到的所有字节码(大约200个左右)都映射到我正在处理的ASM数据结构。
答案 0 :(得分:1)
是的,您选择最不发达国家的指示是正确的。
ASM不会将Java字节码中的操作码映射到API,如org.objectweb.asm.Opcodes
接口的Java-doc(http://asm.ow2.org/asm40/javadoc/user/index.html)
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指令来创建给定的ByteCode指令序列。