我试图确定BCEL库中给定InvokeInstruction的被调用方的MethodGen。问题是我不知道如何使用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或等效值)中获得足够的不同信息。我可以将其链接回被调用的方法。

最佳答案

通常您不能。 BCEL和大多数其他用于在单个类上运行字节码的框架。因此,您将阅读所有可用的类(可以懒惰地做)并构建自己的MethodGens存储库(例如FQN方法名称到MethodGen实例的映射)。

10-08 14:35