Java:检查器框架

我在JavaOne 2012上 了解的有趣的工具之一是Checker Framework 。 Checker 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南岸焊接机器人厂_造船三部高效焊接工艺技术年鉴

为了提升公司高效焊自动化率,实现降本增效目标,造船事业三部积极响应公司领导号召,充分挖掘自身资源,2020年,在高效焊接技术、设备开发研究等方面,不断创新、敢于突破,获取了多项焊接新技术、新…

软工Hello World!团队第二周博客汇总

2017.10.20-2017.10.26 Scrum会议: 第一天:http://www.cnblogs.com/liusx0303/p/7704482.html 第二天:http://www.cnblogs.com/Mingezi/p/7709472.html 第三天:http://www.cnblogs.com/lynlyn/p/7717275.html 第四天:h…

什么是css sprites,如何使用?

css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片、背景图是否重复、背景图定位),显示图片,减轻服务器对图片的请求数量 优点&…

线性回归csv数据集_测试数据科学家线性回归的30个问题

你的目标是数据科学家吗?那你对线性回归了解有多深入呢,下面的30道题,可以帮助你或者测试别人是否真的达到的数据科学家的水平,关注回复,答案在评论区:1)是非题:线性回归是一种受监督的机器学习…

linux调试crontab,linux - crontab 的调试,启动thin服务器

linux - crontab 的调试,启动thin服务器2018-11-18 17:10访问量: 1059分类:技术参考:https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log日志默认位置在 /var/log/syslog 中。 grep CRON 。 如果没有安装MTA的话(例如 mai…

番石榴前提条件课

编写过很多Java文章的人可能都编写了以条件为开头的方法,这些条件可以在继续进行该方法的其余实现之前,先验证提供的参数或要操作的对象的状态。 这些会增加方法的冗长性,有时,尤其是在有多个检查的情况下,几乎会淹没该…

dw空心圆项目符号_如何懂建筑施工图?搞懂这些符号解析,耐下性子研究不会学不会...

施工图纸一个建筑方向,是房屋建筑的依据,更是一种工程语言,它能够明确的规定出我们建造出怎样的建筑,看懂它是入行基础。当然建筑图包含的因素比较多,有具体的建筑符号,尺寸、做法以及技术要求都在里面&…

子域名查询技术

子域名查询是渗透测试中的重要一环,收集尽可能多的子域名就是尽可能地扩大我们的攻击面和了解网络内部结构。 子域名保存位置利用点具体用法DNS服务器区域传送漏洞dig ns.dnsdomain.com target.com axfr主站链接网站爬虫百度site:target.com被动解析字典枚举解析fie…

Dashboard集群

#Dashboard集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##8.Dashboard集群#####在controller1安装配置#安装 yum install openstack-dashboard -y#配置 cp /etc/openstack-dashboard/local_settings{,.bak} #egrep -v #|^$ /etc/openstack-…

canvas学习和滤镜实现

最近学习了 HTML5 中的重头戏--canvas。利用 canvas,前端人员可以很轻松地、进行图像处理。其 API 繁多,这次主要学习常用的 API,并且完成以下两个代码:实现去色滤镜实现负色(反色)滤镜 欢迎入群:857989948 。IT 技术深…

python 数据分析库_五个 Python 常用数据分析库

前言 Python 是常用是数据分析工具,常用的数据分析库有很多,下面主要介绍如下五个分析库:NumPy、Pandas、SciPy、StatsModels、Matplotlib。 NumPy 是一个非常常用的数据分析库,更准确点说是一个数学计算库,包括下面的…

android代码混淆作用,Android分享:代码混淆那些事

1) 前言ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。2) ProGuard作用压缩: 移除无效的类、属性、方法等优化: 优…

echarts图形,图形自适应窗口大小

一个页面只有一个echarts图形时,可以写为myChart.setOption(option);window.onresize myChart.resize;一个页面含有多个echarts图形时,则只有一个图形可自适应窗口大小,另外一个则不能随窗口大小而改变图形大小,解决办法为在每一…

施工部署主要不包括_建筑工程施工方案及培训实例

[南京]大型土石方工程施工方案本资料为[南京]大型土石方工程施工方案格,共43页。内容简介:本工程位于南京化工园内,扬子玉带扬巴路附近,工程项目为江苏成品油管道配设施扬子玉带油库套油库工程,由中国石化股份有限公司…

Markdown 进阶

目录 markdown进阶语法 内容目录加强代码块脚注流程图时序图LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动生成目录有一些编辑器不支持[TOC]标记 加强代码块 使用3个 "" “语言名称”…

Python 字典 values() 方法

描述 Python 字典 values() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有值。 语法 values() 方法语法: D.values() 参数 无。返回值 以列表形式返回字典中的所有值。 实例 以下实例展示了 va…

适用于Atom Feed的Spring MVC

如何仅使用两个类就将提要(Atom)添加到Web应用程序? Spring MVC呢? 这是我的假设: 您正在使用Spring框架 您有一些要发布在供稿中的实体,例如“新闻” 您的“新闻”实体具有creationDate,tit…

python数据类型所占字节数_python标准数据类型 Bytes

预备知识: bin(): """ Return the binary representation of an integer. >>> bin(2796202) 0b1010101010101010101010 """ pass ord(): """ Return the Unicode code point for a one-character…

java第六次作业

《Java技术》第六次作业 (一)学习总结 1.用思维导图对本周的学习内容进行总结。 2.当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。可使用printStackTrace 和getMessage方法了解异常发生的情况。阅读下面的程序&#…

华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...

【5月10日讯】相信大家都知道,备受广大花粉们期待的鸿蒙OS系统终于开始推送公测版本了,并且适配机型也开始不断地增多,而根据华为官方最新消息,华为鸿蒙OS系统将会在6月份开始大规模推送正式版鸿蒙系统,这无疑将会成为…