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