ジャスミンの「LDC_W 」を使用して「一定のプールでの違法なタイプ」を避ける方法は?
質問
ジャスミンコードを生成し、クラスをパラメーターとして取得するメソッドを呼び出したいコンパイラを作成しています。
public class CTest
{
public static void main(String[] args)
throws Exception
{
java.lang.reflect.Array.newInstance(CTest.class, 0);
}
}
だからジャスミンでは、それは次のとおりだと思います:
.class public CTest2
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 1
ldc_w CTest2
iconst_0
invokestatic java/lang/reflect/Array/newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
pop
return
.end method
私がそれを組み立てて実行すると、私は得る:
スレッドの例外「メイン」java.lang.verifyerror :(クラス:ctest2、メソッド:メイン署名:([ljava/lang/string;)v)違法なタイプの定数プール
ctest.class(javaバージョン)とctest2.class(jasminバージョン)の両方の分解されたコードを「Javap -c -verbose」と見て、どちらも同じ方法で定数プールを設定するように見えます。
const #2 = class #16; // CTest
const #16 = Asciz CTest;
0: ldc_w #2; //class CTest
const #14 = Asciz CTest2;
const #17 = class #14; // CTest2
0: ldc_w #17; //class CTest2
私はすでにジャスミンで2つのバグを修正しましたが、「ldc_w」の定数プールにクラスを置くと、「新しい」や「anewarrayなどの他の指示のためにクラスを一定のプールに置くと、それが何が間違っているのかわかりません。 「正しく。
ASMのTraceClassVisitorを使用して.classファイルを見てみましたが、定数プールはダンプしません。
次に私が試すことができることはありますか?
解決
クラスのバージョン番号が少なくとも49であることを確認する必要があります(これについてはvisitldcinsnを参照してください ASM Javadocページ).
所属していません StackOverflow