一、Findbugs
1. 配置
1.1 打開FindBugs視圖:
Windows => Show View => Other… => FindBugs => Bug Info 、Bug Explorer、Bug Reviews
1.2 配置FindBugs
選擇你的項目=>右鍵 => Properties => FindBugs => 選中“Run automatically” => OK
Findbugs各項屬性的配置說明:
Enable project specific setting:該項目是否啓用自身特殊設置(忽略全局設置)
Run automnaticaly:編譯文件時自動運行。
Also on full build:編譯工程時自動運行。必須同時勾選Enable project specific setting
Bug類型說明:
Minimum priority to report:根據bug的優先權級別報告bug。
Malicious code vulnerability:惡意代碼。
Dodgy code:高危代碼。FindBugs團隊認爲該類型下的問題代碼導致bug的可能性很高。
Bad practice:最佳實踐反例。這種類別下的代碼違反了公認的最佳實踐標準,比如某個類實現了equals方法但未實現hashCode方法等。
Correctness:正確性。這種歸類下的問題在某種情況下會導致bug,比如錯誤的強制類型轉換等。
Internationalization:國際化。
Performance:性能。潛在性能問題
Security:安全。
Mutithreaded correctness:多線程的正確性。關注於同步和多線程問題。
1.3 Bug設置
2. 使用
2.1 如下圖:我們在工程的右鍵菜單中選擇Find bugs的菜單項“Find bugs”。
2.2 當findBugs運行後,就可以在bug Explorer 視圖中看到相應的信息,可以雙擊切換到相應代碼 ,就可以對這個代碼改進了,如下圖:
這時我們就可以找到BUG所在並修改
2.3 查看Bug詳細信息
顯示詳細信息如下:
2.4 過濾bug設置:
2.4.1 首先點擊bug行號前的bug標誌,進入bug detail視圖,記下這個bug的id,如下圖的[RCN]
2.4.2 在Bug Explorer窗口中單擊“Filter Bugs by Id“
輸入Type(RCN)或Pattern(RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE)即可找出相應的bug設置
ok確認即可。
2.5 分組查看
選擇相應的分組依據
或者直接如下圖所示分組。
二、Checkstyle
1. 配置
當Checkstyle成功安裝後,在"window->Preferences"中可以看到checkstyle的選項, 如圖所示:
Checkstyle有兩個渠道可以進行配置,一個是全局的,一個是單個項目(Project)的。全局的可以 在整個MyEclipse的workspace中生效, 而單個項目的配置可以在指定的項目中生效,它優先於全局 的配置。
對於單個項目:右鍵點某個項目,然後選擇"Properties"就可以看到Checkstyle的窗口。在"Main"標籤中,"Checkstyle active for this project"前面打勾, 然後在"Simple –use the following check configuration for all files" 下拉框中選擇你的Checkstyle配置文件就可以了。如圖:
對於全局的設置:"window->preferences"就可以看到。設置方法跟單個項目的設置是一樣的。
經過上面的設置,Checkstyle就可以使用了。Checkstyle默認提供了基於Sun的檢查配置文件,並不一定適合每個公司,因此提供了自定義檢查模式。在全局設置中"Global Check Configurations"中單擊"New"按鈕。
起好名字後,單擊"Import"按鈕,選擇文件後,確定即可。
另外,官方幫助可以在MyEclipse的"Help-> HelpeContents"中的" Checkstyle Plug-in " 中找到。內容還是很詳盡的。
2. 使用
很簡單,在項目設置中勾選Checkstyle active for this project後,重新編譯即可。或者右擊項目"Checkstyle -> Check Code with Checkstyle"。
三、JDepend
1. 使用
運行方法是右鍵選擇需要分析的包,選擇 Run JDepend Analysis
於是會出現如下分析結果
2. 說明
JDepend爲每個Package自動生成的依賴性度量指標,包括:
Number of Classes and Interfaces(CC):實現類與抽象接口的數目
面向的設計原則之一The Stable Abstractions Principle (SAP):穩定抽象等價原則指出了包的穩定程度與它的抽象程度(接口的數目)成正比,也就是說,一個包內包含的接口所佔的比重越大,這個包就越穩定。
Afferent Couplings (Ca):向心耦合。依賴該包(包含的類)的外部包(類)的數目(i.e. incoming dependencies),該數值越大,說明該包的擔當的職責越大,也就越穩定。
Efferent Couplings (Ce):離心耦合。被該包依賴的外部包的數目(i.e. outgoing dependencies),該數值越大,說明該包越不獨立(因爲依賴了別的包),也越不穩定。
Abstractness (A):包的抽象度。指一個包內包含的抽象類或接口占整個包中的類的比重。該值處於0,1之間,若A=0,說明包內不包含任何抽象類或接口;若A=1,說明包內全部是抽象類或接口。包的抽象度與穩定性之間的關係上面已經作了說明。
Instability (I):衡量一個包的不穩定程度。I=Ce/(Ce+Ca)。它的值處於[0,1]之間。I=0時說明包是最穩定的,反之I=1則說明包極不穩定。
Distance from the Main Sequence (D): 該指標主要用來評價包的抽象程度與穩定程度的平衡關係,它可以用二維直線圖 A + I = 1 來表示。D=abs((A + I) - 1),也就是說D爲 一個包的抽象度 + 包的不穩定程度 - 1 的絕對值。一個理想的包是:完全抽象的(A=1),非常穩定的(I=0),這時D=0;或者是:完全具體類構成的包(A=0),非常不穩定的 (I=1),這時同樣也有D=0。D=0說明包的抽象程度與穩定程度是平衡的,反之D=1說明包的平衡程度被嚴重破壞。
Package Dependency Cycles:包的循環依賴度。
面向對象的設計原則之一:The Acyclic Dependencies Principle (ADP) - OO設計的無環依賴原則要求包之間不能有循環依賴關係。
四、Eclemma
1. 配置
如果EclEmma只能測試Java Application的測試覆蓋率,那麼它相對命令行版本的Emma來說,提供的增強就不多了。相反,EclEmma提供了很多與MyEclipse緊密結合的功能。它不僅能測試Java Application,還能計算JUnit單元測試,對MyEclipse插件測試的覆蓋率。從圖中我們可以看到EclEmma目前支持幾種類型的程序。
打開EclEmma運行命令按鈕
工具欄右鍵->Customize Perspective
選擇Command Groups Availability->勾選Java Code Coverage->Ok
之後在工具欄就會出現按鈕
2. 使用
首先建立一個 HelloWorld 類,其代碼如下所示:
- package cn.itkt.hotel;
- public class HelloWorld {
- public staticvoid main(String[] args) {
- int rand = (int) (Math.random() *100);
- if (rand % 2 == 0) {
- System.out.println("Hello, world! 0");
- } else
- System.out.println("Hello, world! 1");
- int result = rand % 2 ==0 ? rand + rand : rand * rand;
- System.out.println(result);
- }
- }
package cn.itkt.hotel;
public class HelloWorld {
public static void main(String[] args) {
int rand = (int) (Math.random() * 100);
if (rand % 2 == 0) {
System.out.println("Hello, world! 0");
} else
System.out.println("Hello, world! 1");
int result = rand % 2 == 0 ? rand + rand : rand * rand;
System.out.println(result);
}
}
接下來,我們通過 EclEmma 運行 HelloWorld.main() 函數。
執行完畢之後,我們正在編輯 HelloWorld.java 的窗口將會變成如下所示:
在Java編輯器中,EclEmma用不同的色彩標示了源代碼的測試情況。其中,綠色的行表示該行代碼被完整的執行,紅色部分表示該行代碼根本沒有被執行,而黃色的行表明該行代碼部分被執行。黃色的行通常出現在單行代碼包含分支的情況,例如上圖 中16行就顯示爲黃色。由於程序中有一個隨機確定的分支,因此讀者的窗口可能與這裏稍有不同(11行或者14 行中有且只有一個紅色的行)。
除了在源代碼編輯窗口直接進行着色之外,EclEmma 還提供了一個單獨的視圖來統計程序的覆蓋測試率。
EclEmma提供的Coverage視圖能夠分層的顯示代碼的覆蓋測試率,上圖中的信息表明我們對HelloWorld的一次運行覆蓋了大約68.6%的代碼。
想在一次運行中覆蓋所有的代碼通常比較困難,如果能把多次測試的覆蓋數據綜合起來進行察看,那麼我們就能更方便的掌握多次測試的測試效果。EclEmma提供了這樣的功能。現在,讓我們重複數次對HelloWorld的覆蓋測試。我們注意到Coverage視圖總是顯示最新完成的一次覆蓋測試。事實上,EclEmma爲我們保存了所有的測試結果。接下來,我們將通過 Coverage視圖的工具按鈕來結合多次覆蓋測試的結果。
當我們多次運行 Coverage 之後,我們可以單擊圖中所示工具欄按鈕。之後,一個對話框將被彈出以供用戶選擇需要合併的覆蓋測試。
在合併完成之後,我們可以觀察到 Java 編輯器和 Coverage 視圖中都顯示了合併之後的結果:
圖中,我們可以看到,通過多次運行覆蓋測試,最終我們的代碼達到了91.4%的測試覆蓋率。有趣的是,圖中第三行代碼被標記爲紅色,而此行代碼實際上是不可執行的。奧妙在於,我們沒有生成任何HelloWorld類的實例,因此缺省構造函數沒有被調用,而EclEmma將這個特殊代碼的覆蓋狀態標記在類聲明的第一行。
五、Eclipse Class Decompiler
1. 配置
找到MyEclipse->Window->Preferences->Java->反編譯器
上圖爲Eclipse Class Decompiler的首選項頁面,可以選擇缺省的反編譯器工具,並進行反編譯器的基本設置。缺省的反編譯工具爲JD-Core,JD-Core更爲先進一些,支持泛型、Enum、註解等JDK1.5以後纔有的新語法。
首選項配置選項:
1.1 重用緩存代碼:只會反編譯一次,以後每次打開該類文件,都顯示的是緩存的反編譯代碼。
1.2 忽略已存在的源代碼:若未選中,則查看Class文件是否已綁定了Java源代碼,如果已綁定,則顯示Java源代碼,如果未綁定,則反編譯Class文件。若選中此項,則忽略已綁定的Java源代碼,顯示反編譯結果。
1.3 顯示反編譯器報告:顯示反編譯器反編譯後生成的數據報告及異常信息。
1.4 使用MyEclipse代碼格式化工具:使用Eclipse格式化工具對反編譯結果重新格式化排版,反編譯整個Jar包時,此操作會消耗一些時間。
1.5 使用MyEclipse成員排序:使用Eclipse成員排序對反編譯結果重新格式化排版,反編譯整個Jar包時,此操作會消耗大量時間。
1.6 以註釋方式輸出原始行號信息:如果Class文件包含原始行號信息,則會將行號信息以註釋的方式打印到反編譯結果中。
1.7 根據行號對齊源代碼以便於調試:若選中該項,插件會採用AST工具分析反編譯結果,並根據行號信息調整代碼順序,以便於Debug過程中的單步跟蹤調試。
1.8 設置類反編譯查看器作爲缺省的類文件編輯器:默認爲選中,將忽略MyEclipse自帶的Class Viewer,每次MyEclipse啓動後,默認使用本插件提供的類查看器打開Class文件。
配置完後檢查class文件默認打開方式,MyEclipse->Window->Preferences->General->Editors->File Associations
我們可以看到class文件的打開方式有兩個,類反編譯查看器和MyEclipse自帶的Class File Viewer,而類反編譯查看器是默認的才行。
2. 使用
插件提供了系統菜單,工具欄,當打開了插件提供的類反編譯查看器後,會激活菜單和工具欄選項,可以方便的進行首選項配置,切換反編譯工具重新反編譯,以及導出反編譯結果。
類反編譯查看器右鍵菜單包含了MyEclipse自帶類查看器右鍵菜單的全部選項,並增加了一個“導出反編譯源代碼”菜單項。
打開項目路徑下的Class文件,如果設置類反編譯查看器爲缺省的查看器,直接雙擊Class文件即可,如果沒有設置爲缺省查看器,可以使用右鍵菜單進行查看。
Eclipse Class Decompiler插件也提供了反編譯整個Jar文件或者Java包的反編譯。該操作支持Package Explorer對包顯示佈局的操作,如果是平鋪模式佈局,則導出的源代碼不包含子包,如果是層級模式佈局,則導出選中的包及其所有的子包。
注意:包的“平鋪模式佈局”和“層級模式佈局”的設置
Debug調試:可以在首選項選中對齊行號進行單步跟蹤調試,和普通的包含源代碼時的調試操作完全一致,同樣的也可以設置斷點進行跟蹤。
注意:首選項選擇“根據對齊行號進行單步跟蹤調試”後,必須重新反編譯class文件才行,否則還是原來事先編譯好的代碼,會導致跟蹤調試失敗。重新編譯的方法:1:上面圖中菜單欄。2:上面圖中類打開方式。