2

BCEL では、オペランド スタックにプリミティブ型をプッシュできます。しかし、BCELのスタックにカスタム タイプ オブジェクトをプッシュできるかどうか知りたいですか?

問題のコンテキストを説明できるように、いくつかのコードを提供しています

    class Automobile {

public void getEngine(int carNo,EngineClass engineClassObj){

System.out.println("EngineNo="+engineClassObj.sisNo);
}
}

Now when i load "Automobile" class in memory.

ilist = new InstructionList();
ilist.append(InstructionConstants.ALOAD_0);
ilist.append(new PUSH(pgen,345));

////Hear Now i have to also push the Object on Stack

ilist.append(ifact.createInvoke(_invoking_ClassName,_invoking_MethodName, Type.INT,*
new Type[] { Type.INT,Type.OBJECT }, Constants.INVOKEVIRTUAL));

ilist.append(InstructionConstants.IRETURN);

1-createNew() メソッドを使用して新しいオブジェクトを生成する場合、そのフィールド値をどのように埋めるのですか? 2-または、最初にPUSHを使用してエンジンタイプObjのすべてのフィールド値をスタックにプッシュする場合、メモリ上にオブジェクトを構築してスタックにプッシュする方法があります。これらは私が考えることができるいくつかの解決策です。

しかし、私は正しい解決策を知らないので、まだ助けが必要です...

4

1 に答える 1

1

NEWは、新しいオブジェクトを作成し、それへの参照をスタックに配置します。ConstantPoolGen.addClassで取得できる定数プール内のクラス参照へのインデックスが必要です。例えば:

il = new InstructionList();
il.append(new NEW(cp.addClass("java.lang.StringBuffer")));

これは、BCEL の例の一部である ASTProgram.javaから取得されます。

スタック上のオブジェクト参照を取得する方法は他にもあります。たとえば、ACONST_NULLは null 参照をスタックにプッシュし、ALOADはローカル変数から参照をロードし、 GETSTATICはクラスから静的フィールドをフェッチします。

于 2011-06-06T08:35:49.540 に答える