這里主要介紹三種開源的工具,PMD、CheckStyle和FindBugs,著重是在Ant里的調用,據說商業軟件JTest也是著名的代碼分析工具,哈哈,要花錢的沒有用過。
PMD
(http://pmd.sourceforge.net/)
簡介:
PMD
掃描java源代碼,查找潛在的問題,如:
可能的bugs,如空的try/catch/finally/switch聲明
死亡的代碼,沒有使用的本地變量,參數和私有方法
不合標準的代碼,如String/StringBuffer用法
過于復雜的表達式,如不必要的if表達式
重復的代碼,拷貝、粘貼的代碼
PMD
的含義,如
Project Mess Detector
Project Monitoring Directives
Project Meets Deadline
Programming Mistake Detector…
用法:
可以在命令行下執行,如
pmd c:\Test.java xml rulesets/unusedcode.xml
也可以使用IDE的插件,如Eclipse、IDEA、JBuilder、JCreator等等
這里主要介紹Ant里的調用,
























自定義規則:
有兩個辦法來自定義規則,可以編寫java類和編寫XPath,編寫java類的一般步驟是,先確定要查找的代碼形式,利用PMD自帶的designer.bat工具查看AST(抽象語法樹),然后編寫規則類(繼承net.sourceforge.pmd.AbstractRule),然后編寫一個ruleset的XML文件,最后就可以運行PMD進行檢查。編寫XPath比編寫java類要容易些,但也需要掌握AST的含義,利用designer.bat工具可以查看AST,比如 //ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1] ,這個表達式就是查找類的代碼里是否聲明了多個 Logger ,然后編寫一個 ruleset 的 XML 文件,最后運行 PMD 進行檢查。這里是一個 ruleset 的 XML 文件的例子。
自定義規則集合:












最后,我們運行PMD的時候就可以指定這個
ruleset
文件。
自帶規則的介紹:
PMD
自帶了很多規則集合,并且分類寫入不同的
ruleset
文件,如
Basic
包含每人都必須遵守的代碼最佳實踐,如EmptyCatchBlock
Braces
關于條件分支的規則,如IfStmtsMustUseBraces
Code Size
關于代碼大小的規則,如方法的長度,參數的長度,屬性的個數等
Clone
克隆實現的規則,如是否有super.clone()
Controversial
一些有爭議的規則,如UnnecessaryConstructor不必要的構造器
Coupling
對象連接有關的規則
Design
可以檢查有問題的設計,如SwitchStmtsShouldHaveDefault
Finalizers
使用finalizers時需遵循的規則,如FinalizeOnlyCallsSuperFinalize
Import Statements
和import有關的規則,如DuplicateImports重復import
J2EE
唯一規則UseProperClassLoader,class.getClassLoader()可能不正確,用
Thread.currentThread().getContextClassLoader()
代替
Javabeans
和javabean規范有關的規則,有BeanMembersShouldSerialize屬性必須
序列化和MissingSerialVersionUID缺少序列化ID
JUnit Tests
和JUnit測試有關的,如JUnitSpelling拼寫檢查等
Logging (Java)
檢查Logger的一些錯誤用法,如MoreThanOneLogger多個Logger
Logging (Jakarta)
使用Jakarta Logger的一些規則,有UseCorrectExceptionLogging
異常處理不當和ProperLogger是否正確定義Logger
Migrating
JDK
版本移植的規則,如ReplaceVectorWithList用List代替Vector
Naming
和命名有關的規則,名稱太短或太長,命名的約定等
Optimizations
優化性能的一些規則,如LocalVariableCouldBeFinal本地變量如果
只賦值一次,則應該聲明為final
Strict Exceptions
比較嚴格的異常處理方針,如AvoidCatchingThrowable
Strings
使用String和StringBuffer時應遵守的規則,如StringToString
Sun Security
編寫安全的代碼,有MethodReturnsInternalArray直接返回內部的數組,
更安全的做法是返回一個拷貝和ArrayIsStoredDirectly
Unused Code
檢查未使用的代碼,如UnusedPrivateField未使用的私有屬性
Java Server Pages
編寫jsp的一些方針,如NoLongScripts
Java Server Faces
編寫jsf的一些方針,有DontNestJsfInJstlIteration,在Jsf
里使用jstl的標簽
PMD
里面還有一個寫好的ruleset文件,在pmd-3.8.jar里面的rulesets文件夾下,名稱是favorites.xml,以下是主要部分:

















其它事項:
1.????
可以使用JDK1.5的聲明 @SuppressWarnings(""),禁止PMD的警告。
2.????
可以使用//NOPMD來標記行或塊代碼,禁止PMD警告。
3.????
有兩種方法自定義Rule,編寫java類和編寫XPath。
4.????
PMD
提供了多種IDE的插件來運行PMD。
參考文檔:
PMD
官方文檔(http://pmd.sourceforge.net/)
OnJava
上一篇文檔(
http://www.onjava.com/pub/a/onjava/2003/04/09/pmd_rules.html
)
代碼靜態分析(http://blog.donews.com/foxgem/archive/
?