Я пытаюсь определить 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.), Что я могу связать его с вызываемым методом.
Основываясь на том, что у меня есть до сих пор, я мог бы легко создать эту карту, я думаю, часть того, что я надеялся выяснить, - это если есть способ получить FQN метода. – jbranchaud
Попробуйте invoke.getType (cpg) .getSignature() + "." + invoke.getSignature (cpg) –
Кажется, это дает мне информацию о возвращаемом типе конкретного вызова метода. Однако 'invoke.getName (cpGen);' дает мне имя вызываемого метода. Теперь мне просто нужно сузить класс, содержащий этот метод. – jbranchaud