2012-02-19 59 views
1

嗨我想開始玩Java靜態分析的Java源代碼。作爲一個開始,直接解析我的源代碼樹似乎是最簡單的,但是假設這裏有API。特別是這將是很好,有這使得代碼像這樣的API:Java靜態分析:入門

for (MetaClass m : mySourcePackage.getClasses()) 
{ 
     System.out.println(m.getMethods().size()); 
     ... 
} 

當然,對於任何給定的類,你可以使用反射做到這一點 - 但我更感興趣的是靜態分析的整體源代碼包,從頭開始 - 逐個遍歷類(例如,評估諸如測試覆蓋率,最大行數等等)。

是否有任何高質量的開源框架來進行這樣的元分析(或者,是否有可能通過某個類路徑啓動JVM並在JVM內部進行這樣的分析)?

請記住,我並不特別擔心DI和反射等問題(至少現在不在這裏)。

+0

你可能想要*解析Java源代碼,ANTLR有一個現成的[語法](http://openjdk.java.net/projects/compiler-grammar /antlrworks/Java.g)。另外考慮分析字節碼 - 令人驚訝的是,你可能會發現它更容易。 – 2012-02-19 22:31:35

+0

JAva - > Java ..請改正標題;) – h3xStream 2012-02-19 22:50:04

回答

0

如果您對代碼的測試覆蓋率的靜態分析感興趣,可以使用用於Eclipse IDE的Cobertura - 和eCobertura插件。

+1

Coberatura做* static *分析?我認爲它做了測試覆蓋率數據的運行時數據收集。 – 2012-02-27 07:27:54

1

Javalib/Sawja是用於編寫用於Java的靜態分析器的庫,編號爲Caml

它提供了許多需要靜態分析的基石,包括原語:

  • 解析Java字節碼
  • 創建和操縱中間表示
  • 操縱單個指令,方法,類和整程序
  • 句柄類層次結構和控制流算法

文檔是相當不錯的,如果我記得正確的話,發行包括幾個例子,讓你開始。

考慮到所有這些,實現您描述的那種源代碼度量標準應該既快速又簡單。例如,下面是一個簡短的,未經檢驗的片段,其目的是在給定類計數的方法數:

open Sawja_pack 
open Javalib_pack 

let size methodmap = 
    JBasics.MethodMap.fold (fun _ _ count -> count+1) methodmap 0 

let main classname classpath = 
    let interface_or_class = Javalib.get_class classpath (JBasics.make_cn classname) in 
    let all_concrete_methods= Javalib.get_concrete_methods interface_or_class in 
    print_int (size all_concrete_methods); 
    exit 0