Java:检查器框架

本文介绍了Checker Framework,一个用于增强Java类型系统的工具,帮助开发者检测和预防程序错误。Checker Framework实现了JSR 305的部分功能,允许在更多位置使用注解。通过示例展示了如何下载、安装和使用Checker Framework进行类型检查,强调了其在空值检查中的应用,以及如何通过设置别名简化编译过程。
摘要由CSDN通过智能技术生成

我在JavaOne 2012上 了解的有趣的工具之一是Checker FrameworkChecker Framework的网页之一 指出 ,Checker Framework“增强了Java的类型系统,使其更强大,更有用”,从而使软件开发人员“能够检测并防止Java程序中的错误”。 查看Checker框架的一种方法是,实现JSR 305 (“软件缺陷检测批注”)的实施,前提是该软件未进入休眠阶段。

JSR 308 (“ Java类型的注释”)的目的是“扩展Java注释语法,以允许在出现任何类型时进行注释”。 一旦JSR 308被批准并成为Java编程语言的一部分,便可以在当前不允许使用的地方使用注释。 尽管JSR 308仍处于Early Draft Review 2阶段,但Checker Framework允许开发人员在JSR 308允许使用的当前不允许的地方添加注释掉的注释代码。在此必须注意,JSR 308仅使注释更一般可用(指定可以应用它们的更多类型的源代码),并且不指定任何新注释。

Checker Framework需要Java SE 6或更高版本。 Checker框架可以作为单个ZIP文件下载到http://types.cs.washington.edu/checker-framework/current/checkers.zip 。 可以将下载的文件解压缩到目录checker-framework ,然后可以将名为CHECKERS的环境变量设置为指向该扩展目录的子目录“ checkers”。 例如,如果将checkers.zip压缩到C:\checker-framework ,那么环境变量CHECKERS应该设置为C:\checker-framework\checkers

Checker Framework的checkers.zip已被下载,扩展并由CHECKERS环境变量指向,现在该尝试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

上面的代码应该导致输出看起来像下一个屏幕快照中所示。

现在可以将已安装的Checker Framework应用于编译代码。 下一个代码清单显示了一个简单的类,该类通过checkers.nullness.quals.NonNull@NonNull )批注指定方法参数不应为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注释的参数的方法。 NetBeans 7.3会用黄色的花键进行标记,并在悬停时发出警告。 这显示在下一个屏幕快照中。

尽管NetBeans标记了标有@NonNull批注的参数的null设置,但编译器会毫无疑问地构建该代码。 这是Checker Framework出现的地方。因为键入前面显示的长命令很麻烦,所以我可以使用脚本运行上面显示的命令,或者按照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附加类型。

在显示如何指定处理器以强制在编译期间强制执行@NonNull之前,我想快速演示一下此编译方法仍将报告标准编译器错误。 仅在此示例中,我已将第17行传递给感兴趣的方法的'nullStr'变量重命名为'nullStry',因此它是编译器错误。 接下来的两个屏幕快照显示了此更改(以及NetBeans报告的编译错误),以及Checker Framework编译方法还如何报告javac错误。

已经显示了这种编译方法可以正常编译可编译代码,正常报告编译器错误并适当显示版本,现在该将其应用于更强大的类型强制了。 我通过删除添加的额外“ y”来修复代码中的编译器错误。 然后,我需要将-processor checkers.nullness.NullnessChecker作为附加标志和参数传递给编译过程。 请注意,除了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值