2

さまざまなメソッドのクラスをインストルメント化するときに、メソッドにテキスト ファイルへの書き込み操作を実行させるため。最初に、明示的に定義されたローカル変数 3160 に文字列を格納しました。既存の変数との競合を防ぐためにこれらの変数を選択する方法。

このスニペットのように、コードはメソッドに入るたびにクラス名をテキスト ファイルに書き込む作業を行います。そのためには、変数 3160 を使用して文字列 s をスタックにロードする必要がありました (既に定義されている変数名が変数 s (3160) と競合しないように、値は大きく保たれます。私の質問は、メソッドでローカル変数を定義する方法です。 ASM ライブラリを使用したインストルメンテーション中 この質問は時期尚早に思えるかもしれませんが、それは私が初心者だからです。

    String s= className;
    mv.visitLdcInsn(s);
    mv.visitVarInsn(Opcodes.ASTORE, 3160);
    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
    mv.visitInsn(Opcodes.DUP);
    mv.visitVarInsn(Opcodes.ALOAD, 3160);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;");
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/me/database/dataCollectionFile/Info", "callMeAnyTime", "()Ljava/lang/String;");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
4

3 に答える 3

2

LocalVariablesSorterアダプターを使用する必要があります(そこから独自のビジターを拡張するか、MethodWriter の前にビジター チェーンに追加します)。次に、新しい変数が必要になったら、LocalVariablesSorter.newLocal()メソッドを呼び出して、割り当てられた新しい変数スロットを取得できます。詳細については、 ASM ガイドも参照してください。

于 2012-07-26T13:27:16.217 に答える
1

newLocal(Type.type) は、私の場合に役立つことがわかったものであり、Eugene Kuleshov に感謝します。

助けてくれたピーター・ローリー:)

于 2012-07-26T13:49:20.893 に答える
1

ローカル変数のデバッグ テーブルを見て、3160 ではなく 2 または 10 である可能性が高い、次に使用可能な ID を使用します。

デバッグ情報がない場合は、コードを複数回スキャンして、最初に使用された ID の数を確認する必要がある場合があります。

注:歴史doublelongな理由から、2 つの ID が必要です。

于 2012-07-26T12:57:31.157 に答える