ジャスミンの「LDC_W 」を使用して「一定のプールでの違法なタイプ」を避ける方法は?

StackOverflow https://stackoverflow.com/questions/2784791

  •  03-10-2019
  •  | 
  •  

質問

ジャスミンコードを生成し、クラスをパラメーターとして取得するメソッドを呼び出したいコンパイラを作成しています。

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ページ).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top