如何确定InvokeInstruction(BCEL)调用的方法?

时间:2012-06-07 17:35:25

标签: java methods bytecode invocation bcel

我正在尝试确定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或等价物)我可以将它链接回被调用的方法。

1 个答案:

答案 0 :(得分:0)

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