2017-04-04 114 views
0

我需要在運行時分析java方法主體。 javassist提供了很多方法來幫助我做到這一點。但現在我需要知道給定的方法是否包含語句或循環。我怎樣才能做到這一點?如何在使用javassist的java方法中查找if語句

大多數問題可以通過使用

method.instrument(new ExprEditor() { 
    @Override 
    public void edit(MethodCall m) { 
     // do some checks 
    } 
}); 

回答但對於分支機構或循環無編輯方法。 我試了一下,到目前爲止:

for (CodeIterator ci = method.getMethodInfo().getCodeAttribute().iterator(); ci.hasNext();) { 
    int op = ci.next(); 
    System.out.println(Mnemonic.OPCODE[op]); 
} 

希望能找到一些if_*goto。但沒有發現這樣的事情。

回答

1

所以,我想自己有方法細粒度分析了Javassist,我發現這是真的,真的很難如果不是不可能的。

無論如何,我發現this是一個Java結構良好的Javassist分析器項目。如果你在github上鍊接到有趣的軟件包。先仔細看一下ControlFlow.java,然後再看看'Analyzer.java'。在這裏你可以找到一些用Javassist完成的很酷的東西。

當我處於你的位置時,我盡力解決了我的問題,但是我傾向於這樣一個事實:Javassist不是爲字節碼的超細粒度分析而構建的,因此我挖掘了更多,並且發現還有另一個庫更適合於此任務:ASM。在它的website你可以找到一些關於它的教程,如果你有興趣。

注意:使用此工具實際上可以通過分支甚至逐行分析您的班級分支。

+0

你能舉一個例子來解釋asm如何查找if語句嗎? – Qoros

+0

嘗試結帳此鏈接https://stackoverflow.com/questions/37066812/selecting-and-modifying-if-statement-with-asm – rakwaht