1. 程式人生 > >使用ASTView分析程式碼呼叫關係分析的具體應用

使用ASTView分析程式碼呼叫關係分析的具體應用

受到understand的工具的啟發,想自己做一個針對java類的程式碼靜態呼叫工具。

先舉個例子:

方法名稱:com.person.api.AccountAPI.getPersonLeastInfo(args[1])

   call {[

com.house.api.HouseApiTest.test_getConfusedPhoneNumber_normal(args[0])_935,

com.house.service.impl.UserServiceImpl.getUserInfo(args[3])_66,

com.house.api.HouseApiTest.test_getPhoneNumber_normal(args[0])_899

]}


先說下成果,可以通過關鍵詞,計算出xxx類的方法被哪些模組的哪些方法呼叫例如上圖計算出來的,

com.person.api.AccountAPI這個類的getPersonLeastInfo(1個引數的方法),被呼叫3處,分別在3個不同類的935行(0個引數方法),66行(3個引數方法),899行(0個引數方法)。

作用:可以在研發提交程式碼後,或者研發修改程式碼後,自動掃描程式碼的影響面。往小了說 就是修改一處程式碼 那裡被影響了。

適用於:java類程式碼跨模組之間呼叫,如果是單一模組的話 可以直接用eclipse裡面的open call hierarchy直接使用。

實現的流程哈:

第1步,首先先確保你的所有要掃描的程式碼都是最新的程式碼(這裡多說幾句,可以更加版本號進行比對,或者做一個類似於jenkins那樣的定時觸發工具。。好多種做法這個就不一一去說了)

第2步,通過遞迴的辦法,一個一個檔案掃描出來所有的*.java類檔案,並記錄下他們的位置

第3步,通過呼叫ASTView,一行一行,一個方法一個方法的吧 一個*.java裡面的資訊儲存到一個大的集合中。

1-3步完成後,已經可以知道了很多資訊,但是這些資訊 僅僅是A方法中呼叫了哪些B方法

例如

public void A{

B();

}

第4步,這時,我們知道了A都呼叫了哪些B,但是我們的需求可能是B方法被哪些A呼叫了。

這時就需要從新變數一般我們第3步的集合,   在遍歷的時候,我們可以增加一些簡單的過濾邏輯,比如只過濾xxxx模組的,只過濾xxxx名字的。很多種條件,按照自己需要的去實現