Как определить метод, вызываемый InvokeInstruction (BCEL)?

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

Если у меня есть объект 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()), но мне интересно, есть ли способ, которым я могу получить достаточно четкой информации из инструкции вызова (например, FQN метода или эквивалент), чтобы я мог связать его с вызываемым методом.


person jbranchaud    schedule 07.06.2012    source источник


Ответы (1)


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

person Eugene Kuleshov    schedule 07.06.2012
comment
Основываясь на том, что у меня есть до сих пор, я мог бы довольно легко построить эту карту, я думаю, часть того, что я надеялся выяснить, - это есть ли способ получить полное доменное имя метода. - person jbranchaud; 07.06.2012
comment
Попробуйте invoke.getType(cpg).getSignature() + . + invoke.getSignature(cpg) - person Eugene Kuleshov; 07.06.2012
comment
Кажется, они дают мне информацию о возвращаемом типе вызова конкретного метода. Однако invoke.getName(cpGen); дает мне имя вызываемого метода. Теперь мне просто нужно уточнить, каким может быть класс, содержащий метод. - person jbranchaud; 08.06.2012
comment
Верно, getReferenceType() должен вернуть владельца. Вы также должны учитывать аргументы метода при построении полного доменного имени для данного метода. - person Eugene Kuleshov; 08.06.2012
comment
@EugeneKuleshov Я пытаюсь найти метод, вызываемый инструкцией. Другими словами, мне нужно извлечь метод. Как я могу это сделать? - person Mathew Kurian; 24.03.2014