据推测,整个方法主体将在InsnList中进行处理和转换,其中包含一组AbstractInsnNode,以及一些非字节码节点(如FrameNode、LineNumberNode等)。XXXNode类javadoc通常包含一些有用的信息(例如,哪些操作码映射到这个XXXNode),但是映射似乎并不是完全的,所以我不完全确定在所有情况下会发生什么:
WIDE字节码会发生什么?它会自动折叠到下一个指令中吗?大概是这样,但我找不到任何明确声明LDC,LDC_2,LDC_2W)都映射到LdcInsnNodes吗?想必是这样,但文件上没有说一般来说,java字节码-> ASM类是否有方便的映射?我正在对java字节码序列(即方法体)进行一些处理,并希望检查我可能收到的所有字节码(全部大约200个字节码)是否映射到我正在正确处理的ASM数据结构。
发布于 2013-02-22 19:10:32
是的,你对最不发达国家的指示是正确的。
ASM没有像org.objectweb.asm.Opcodes接口的Java (http://asm.ow2.org/asm40/javadoc/user/index.html)中所提到的那样将Java字节码中的操作码映射到API。
public interface Opcodes定义JVM操作码、访问标志和数组类型代码。此接口并不定义所有JVM操作码,因为某些操作码是自动处理的。例如,如果可能,xLOAD和xSTORE操作码将被xLOAD_n和xSTORE_n操作码自动替换。因此,在这个接口中没有定义xLOAD_n和xSTORE_n操作码。同样,对于最不发达国家,在必要时自动由LDC_W或LDC2_W、WIDE、GOTO_W和JSR_W代替。
这将转换为ASM中的其他API。
在此也可以证实这一点:
首先,请注意,ASM没有提供来自原始字节码.- http://osdir.com/ml/java.objectweb.asm/2008-03/msg00031.html的精确一对一映射。
对于问题的第二部分,您可以尝试使用FAQ:http://asm.ow2.org/doc/faq.html#Q10中提到的http://asm.ow2.org/doc/faq.html#Q10。它将基本上列出您必须使用ASM调用的Java指令,以创建给定的ByteCode指令序列。
https://stackoverflow.com/questions/15029949
复制相似问题