2012-06-07 58 views
0

我正在試圖確定BCEL庫中給定InvokeInstruction的被調用者的MethodGen。問題是,我不知道如何使用InvokeInstruction來獲取它正試圖調用的MethodGen。如何確定由調用指令(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())的直接路線,但我想知道是否有某種方式,我可以從調用指令得到足夠的不同信息(例如方法的FQN或equiv。),我可以將其鏈接回被調用的方法。

回答

0

一般你不能。 BCEL和大多數其他框架,用於處理在單個類上運行的字節碼。因此,您將讀取所有可用的類(可以做到這一點),並構建您自己的MethodGens存儲庫(例如,將FQN方法名稱映射到MethodGen實例)。

+0

根據我目前爲止的內容,我可以非常輕鬆地構建該地圖,我想我希望找到的一部分是如果有方法可以獲得該方法的FQN。 – jbranchaud

+0

嘗試invoke.getType(cpg).getSignature()+「。」 + invoke.getSignature(cpg) –

+0

這些似乎給我關於特定方法調用的返回類型的信息。但是,'invoke.getName(cpGen);'給了我調用方法的名字。現在我只需要縮小包含該方法的類就可以了。 – jbranchaud