1

System.out.println() 呼び出しをすべてのメソッドの最初の行 (init および clinit メソッドを除く) に追加して、どのメソッドがいつ呼び出されるかを確認するために BCEL を使用しています。

これは私のコードatmです(いくつかの擬似を含む):

    Instruction ins = null;
    f (first instruction is ALOAD_0) {
       ins = get next instruction
    } else {
       ins = this instruction;
    }

    list.insert(ins, new GETSTATIC(cgen.getConstantPool().addFieldref("java/lang/System", "out", "Ljava/io/PrintStream;")));
    list.insert(ins, new LDC(cgen.getConstantPool().addUtf8("debug message")));
    list.insert(ins, new INVOKEVIRTUAL(cgen.getConstantPool().addMethodref("java/io/PrintStream", "println", "(Ljava/lang/String;)V")));

編集されたクラスはバイトコードでは問題ないように見えますが、何らかの理由でこのクラスは機能しません。私が間違っていることはありますか?

4

2 に答える 2

1

2つの引数をプッシュしていますが、一部のメソッドでは、これがそのメソッドの最大スタックサイズよりも大きい場合があります。メソッドの最大スタックサイズも調整する必要があります。

javapの出力を見ると、次のようになります。

Code:
    Stack=4, Locals=8, Args_size=3

Stackが2未満のメソッドの場合、Stackを2に上げる必要があります。

于 2011-01-28T21:49:36.320 に答える
1

問題は解決しました。.addUtf8代わりに使用していました.addString

于 2011-01-28T23:42:44.843 に答える