2012-06-07 2 views
0

Я пытаюсь определить MethodGen вызываемого абонента для данного InvokeInstruction в библиотеке BCEL. Проблема в том, что я не знаю, как использовать InvokeInstruction для доступа к MethodGen, который он пытается вызвать.Как определить метод, вызванный InvokeInstruction (BCEL)?

Если у меня есть объект BCEL MethodGen для основного метода программы, я могу пойти по списку команд и найти те, которые InvokeInstructions:

// Assume MethodGen mainMG is given to us 
Instruction[] insns = mainMG.getInstructionList().getInstructions(); 
for(Instruction insn : insns) { 
    if(insn instanceof InvokeInstruction) { 
     // great, found an invoke instruction 
     InvokeInstruction invoke = (InvokeInstruction)insn; 

     // what do I do with it now? 
    } 
} 

Некоторые из документации BCEL является большим и другим части вроде бы отсутствуют. Любые предложения о том, как связать InvokeInstruction с MethodGen метода, который вызывается?

Если это упрощает, я могу предположить, что программа не имеет никакого полиморфизма. Хотя в какой-то момент мне придется иметь дело с этим (консервативно).


Разъяснение: Я понимаю, что не существует прямой путь для этого (например invoke.getCalledMethodGen()), но мне интересно, если есть какой-то способ, что я могу получить достаточно четкую информацию из инструкции Invoke (например, метода FQN или equiv.), Что я могу связать его с вызываемым методом.

ответ

0

Как правило, вы не можете. BCEL и большинство других фреймворков для работы с байт-кодом, работающим на одном классе. Таким образом, вы прочитаете все доступные классы (можете сделать это лениво) и создайте собственный репозиторий MethodGens (например, карту имени метода FQN для экземпляров MethodGen).

+0

Основываясь на том, что у меня есть до сих пор, я мог бы легко создать эту карту, я думаю, часть того, что я надеялся выяснить, - это если есть способ получить FQN метода. – jbranchaud

+0

Попробуйте invoke.getType (cpg) .getSignature() + "." + invoke.getSignature (cpg) –

+0

Кажется, это дает мне информацию о возвращаемом типе конкретного вызова метода. Однако 'invoke.getName (cpGen);' дает мне имя вызываемого метода. Теперь мне просто нужно сузить класс, содержащий этот метод. – jbranchaud

Смежные вопросы