Java:检查器框架
我在JavaOne 2012上 了解的有趣的工具之一是Checker Framework 。 Checker Framework的網頁之一 指出 ,Checker Framework“增強了Java的類型系統(tǒng),使其更強大,更有用”,從而使軟件開發(fā)人員“能夠檢測并防止Java程序中的錯誤”。 查看Checker框架的一種方法是,實現(xiàn)JSR 305 (“軟件缺陷檢測批注”)的實施,前提是該軟件未進入休眠階段。
JSR 308 (“ Java類型的注釋”)的目的是“擴展Java注釋語法,以允許在出現(xiàn)任何類型時進行注釋”。 一旦JSR 308被批準并成為Java編程語言的一部分,便可以在當前不允許使用的地方使用注釋。 盡管JSR 308仍處于Early Draft Review 2階段,但Checker Framework允許開發(fā)人員在JSR 308允許使用的當前不允許的地方添加注釋掉的注釋代碼。在此必須注意,JSR 308僅使注釋更一般可用(指定可以應用它們的更多類型的源代碼),并且不指定任何新注釋。
Checker Framework需要Java SE 6或更高版本。 Checker框架可以作為單個ZIP文件下載到http://types.cs.washington.edu/checker-framework/current/checkers.zip 。 可以將下載的文件解壓縮到目錄checker-framework ,然后可以將名為CHECKERS的環(huán)境變量設置為指向該擴展目錄的子目錄“ checkers”。 例如,如果將checkers.zip壓縮到C:\checker-framework ,那么環(huán)境變量CHECKERS應該設置為C:\checker-framework\checkers 。
Checker Framework的checkers.zip已被下載,擴展并由CHECKERS環(huán)境變量指向,現(xiàn)在該嘗試Checker Framework了。 接下來顯示運行Checker Framework的“很長的路要走”,并與-version標記一起使用以驗證是否應用了Checker Framework:
視窗
java -Xbootclasspath/p:%CHECKERS%/binary/jsr308-all.jar -jar %CHECKERS%/binary/jsr308-all.jar -version的Linux
java -Xbootclasspath/p:$CHECKERS/binary/jsr308-all.jar -jar $CHECKERS/binary/jsr308-all.jar -version上面的代碼應該導致輸出看起來像下一個屏幕快照中所示。
現(xiàn)在可以將已安裝的Checker Framework應用于編譯代碼。 下一個代碼清單顯示了一個簡單的類,該類通過checkers.nullness.quals.NonNull ( @NonNull )批注指定方法參數(shù)不應為null。
使用Checker Framework的@NonNull的@NonNull
package dustin.examples;import checkers.nullness.quals.NonNull; import static java.lang.System.out;public class CheckersDemo {public void printNonNullToString(@NonNull final Object object){out.println(object.toString());}public static void main(final String[] arguments){final CheckersDemo me = new CheckersDemo();final String nullStr = null;me.printNonNullToString(nullStr);} }上面的代碼清單顯示了將空值傳遞給帶有@NonNull注釋的參數(shù)的方法。 NetBeans 7.3會用黃色的花鍵進行標記,并在懸停時發(fā)出警告。 這顯示在下一個屏幕快照中。
盡管NetBeans標記了標有@NonNull批注的參數(shù)的null設置,但編譯器會毫無疑問地構建該代碼。 這是Checker Framework出現(xiàn)的地方。因為鍵入前面顯示的長命令很麻煩,所以我可以使用腳本運行上面顯示的命令,或者按照Checker Framework安裝說明中的說明設置別名。 在這種情況下,我將使用如下別名:
為Java Checker設置Windows命令行別名
doskey javachecker=java -Xbootclasspath/p:%CHECKERS%\binary\jsr308-all.jar -jar %CHECKERS%\binary\jsr308-all.jar $*下一個屏幕快照中演示了此別名的設置以及如何使用-version標志運行它。
將這種方法與別名集一起應用要容易得多。 這可以用來編譯相關的類,如下所示(使用我的“ javachecker”別名的命令和顯示結果的圖像)。
javachecker -d classes src\dustin\examples\*.java
上面的命令演示了我能夠使用普通的javac選項(例如-d為已編譯的.class文件指定目標目錄,并傳遞要正常編譯的Java源文件。 該示例還說明,如果不指定檢查器處理器作為編譯的一部分運行,則在編譯期間不會強制使用@NotNull附加類型。
在顯示如何指定處理器以強制在編譯期間強制執(zhí)行@NonNull之前,我想快速演示一下此編譯方法仍將報告標準編譯器錯誤。 僅在此示例中,我已將第17行傳遞給感興趣的方法的'nullStr'變量重命名為'nullStry',因此它是編譯器錯誤。 接下來的兩個屏幕快照顯示了此更改(以及NetBeans報告的編譯錯誤),以及Checker Framework編譯方法還如何報告javac錯誤。
已經顯示了這種編譯方法可以正常編譯可編譯代碼,正常報告編譯器錯誤并適當顯示版本,現(xiàn)在該將其應用于更強大的類型強制了。 我通過刪除添加的額外“ y”來修復代碼中的編譯器錯誤。 然后,我需要將-processor checkers.nullness.NullnessChecker作為附加標志和參數(shù)傳遞給編譯過程。 請注意,除了NullnessChecker之外,還有其他處理器,但是我在這里使用NullnessChecker來在編譯時強制@NonNull 。
下面顯示了該命令以及顯示該命令實際操作的輸出窗口。 請注意,編譯過程不允許完成,并且會報告基于違反@NonNull類型的錯誤。
javachecker -processor checkers.nullness.NullnessChecker -d classes src\dustin\examples\*.java
這篇博客文章介紹了Checker Framework,并展示了如何快速將其應用于Java源代碼中更強大的類型強制。 在這里,我只關注一種類型更強的類型,但是Checker Framework提供了其他內置的類型檢查,并支持編寫自定義類型強制檢查的選項。
參考:來自我們的JCG合作伙伴 Dustin Marx 的Checker框架,來自Inspired by Actual Events博客。
翻譯自: https://www.javacodegeeks.com/2012/10/java-the-checker-framework.html
總結
以上是生活随笔為你收集整理的Java:检查器框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国银行外汇入账需要本人亲自去办理吗?
- 下一篇: (c与linux)