Можем ли мы поместить объект пользовательского типа в операнд стека в BCEL? - PullRequest
2 голосов
/ 06 июня 2011

В 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-или, если я сначала помещаю значения всех полей типа Engine Obj в стек, используя PUSH, то могу узнать, как построить объект в памяти, а затем перенести его в стек.вот какое-то решение, о котором я могу подумать.

Но я не знаю правильного решения, так что все еще нужна помощь ...

1 Ответ

1 голос
/ 06 июня 2011

NEW создает новый объект и помещает ссылку на него в стек.Ему нужен индекс для ссылки на класс в пуле констант, который можно получить с помощью ConstantPoolGen.addClass .Например:

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

Это взято из ASTProgram.java , который является частью примеров BCEL.

Существуют и другие способы получения ссылки на объект в стеке.также.Например, ACONST_NULL помещает пустую ссылку в стек, ALOAD загружает ссылку из локальной переменной или GETSTATIC выбирает статическое поле из класса.

...