2

おそらく、メソッド本体全体が処理され、いくつかの非バイトコード ノード ( 、 など) とともに一連のInsnListが含まれる に変換されます。XXXNode クラスの javadoc には通常、いくつかの有用な情報 (たとえば、この XXXNode にマップされるオペコード) が含まれていますが、マッピングは完全ではないようです。AbstractInsnNodeFrameNodeLineNumberNode

  • WIDEバイトコードはどうなりますか? 次の命令に自動的に折りたたまれますか? おそらくそうですが、それを明示的に述べているものは何も見つかりません
  • すべての Ldc 命令 ( LDCLDC_2LDC_2W) はすべて LdcInsnNodes にマップされますか? おそらくそうですが、ドキュメントには記載されていません

一般に、Java バイトコード -> ASM クラスの便利なマッピングはありますか? 私は Java バイトコード シーケンス (つまり、メソッド本体) でいくつかの処理を行っており、受信する可能性のあるすべてのバイトコード (約 200 個程度) が、適切に処理している ASM データ構造にマップされていることを確認したいと考えています。

4

1 に答える 1

2

はい、あなたはLDCの指示とWIDEに適しています。

ASMは、org.objectweb.asm.OpcodesインターフェイスのJava-doc(http://asm.ow2.org/asm40/javadoc/user/index.html)の説明に記載されているように、JavaバイトコードのオペコードをAPIにマップしません。

public interface Opcodes

JVMオペコード、アクセスフラグ、および配列タイプコードを定義します。一部のオペコードは自動的に処理されるため、このインターフェースはすべてのJVMオペコードを定義するわけではありません。たとえば、xLOADおよびxSTOREオペコードは、可能な場合、xL​​OAD_nおよびxSTORE_nオペコードに自動的に置き換えられます。したがって、xLOAD_nおよびxSTORE_nオペコードはこのインターフェイスでは定義されません。LDCの場合も同様に、必要に応じてLDC_WまたはLDC2_W、WIDE、GOTO_W、およびJSR_Wに自動的に置き換えられます。

そして、これはASMの他のAPIに変換されます。

これはここでも確認できます:

まず、ASMは元のバイトコードからの正確な1対1のマッピングを提供しないことに注意してください...-http://osdir.com/ml/java.objectweb.asm/2008-03/msg00031.html

質問の2番目の部分については、FAQに記載されているASMiferを使用してみてください:http://asm.ow2.org/doc/faq.html#Q10。基本的に、ASMを使用して指定された一連のByteCode命令を作成するために呼び出す必要のあるJava命令がリストされます。

于 2013-02-22T19:10:32.610 に答える