将IDE检查应用于自定义Java批注

J2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 ,框架,IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例,说明如何使用自定义注释在Java中增加类型安全性 。 在本文中,我着眼于编写一个简单的自定义批注并将其在NetBeans ( 8.0.2 )和IntelliJ IDEA ( 14.0.3 )中使用,以帮助开发人员确定其代码中需要进一步注意的问题。

在文章充分利用Java的元数据,第2部分:自定义注释中 , Jason Hunter演示了@Unfinished注释,作为编写自定义Java注释的示例。 我将在本文中演示@Unfinished注释的其他实现。 这就是自定义注释的美:可以编写一个最适合自己需求的注释。 我的@Unfinished批注的代码显示在下一个代码清单中。

Unfinished.java:定义自定义@Unfinished批注

package dustin.examples.annotations;import static java.lang.annotation.ElementType.*;import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Example of a custom annotation that marks Java code constructs* that are not yet completed.** Notes about custom annotations specific to this example:*   - @Documented indicates available for public documentation*   - CLASS retention policy means that compiler places annotation*     information in compiled .class files, but JVM is NOT aware*     of the annotation at runtime.*   - @Target parameters (statically imported) indicate that this*     annotation can be applied to constructors, fields,*     local variables, methods, packages, parameters, and*     classes/interfaces.*   - Methods defined for this @interface without 'default' are*     required settings for application of this annotation. In*     this case, the "finishBy" element is NOT required (but*     recommended!) but the "value" element is required.*   - "value" element has special significance in custom Java*     annotations: it is the assumed annotation element if*     a String is provided to the annotation without explicit*     element name called out.*/
@Documented
@Retention(RetentionPolicy.CLASS)
@Target({CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE})
public @interface Unfinished
{/** Description of the unfinished construct. */String value();/*** Date, build, or event by which the annotated construct* is anticipated to be finished.*/String finishBy() default "Unknown";
}

下一个代码清单在一个简单的类中显示了@Unfinished应用程序,还有很多工作要做。

WorkInProgress.java:应用@未完成的自定义批注

package dustin.examples.annotations.demo;import dustin.examples.annotations.Unfinished;/*** Demonstrates custom Java annotation @Unfinished.*/
public class WorkInProgress
{@Unfinished("This will do something good by Revision 2.")public void doSomethingGood(){}@Unfinished(value = "Do something good here.", finishBy = "Revision 2")public void doSomethingElseGood(){}
}

默认情况下,不完整类将注释的“ value”元素用于一种方法,然后将“ finishedBy”元素用于第二种方法。 从最后两个代码清单的定义或@Unfinished使用可以@Unfinished

  1. 注释元素包含“默认”意味着不需要使用注释的人为该元素提供值。
  2. 如果仅为注释提供一个值,并且没有明确的元素名称,则假定为“值”元素。
  3. 如果仅指定一个注释元素,则不需要提供名称“值”,但如果指定了多个注释元素,则必须提供名称。
  4. 之所以在这里使用CLASS的保留级别,是因为我觉得使用Java类的编译版本的工具将能够使用此信息,并且我预计该信息不会在运行时使用。
  5. 最好仔细选择哪些注释元素应具有“默认”值,因为不具有“默认”值需要指定一个元素,这在某些情况下可能是所需的行为。

自定义批注的使用可以为其他开发人员和工具提供一种标准化的机制,以构建“可执行的”和更受控制的描述。 与留下带有评论的消息相比,此方法通常是有利的,因为评论的标准化程度较低,并且容易出现拼写错误和区分大小写,拼写和其他差异的情况。 与解析任意文本相比,注释可以更好地执行约定,并允许工具更有效地利用它们传达的内容。 获得自定义注释相对于任意注释的某些好处的最明显的方法可能是使用注释处理器。 多个IDE和框架(例如Checker Framework)处理注释。 关于编写自定义批注处理器的在线参考文献也很多,可与Jav编译器一起使用以提供警告。 在本文的其余部分中,我将重点介绍如何应用两个较流行的Java IDE( NetBeans和IntelliJ IDEA )来将这些注释报告为提示/检查。 在这篇文章中,我并不是在将注解处理器集成到IDE的编译过程中,也不是在将自定义处理器与命令行Java编译器集成。

在NetBeans中检查@未完成的注释

我之前曾写过有关创建NetBeans 7.1自定义提示的博文,该过程与NetBeans 8几乎相同。第一步是使用Refactor-> Inspect and Transform…选项,如下面的屏幕快照所示。

netbeans802-refactorInspectAndTransform

当选择Refactor-> Inspect and Transform…时 ,将显示如下所示的弹出窗口。

netbeans802-inspectTransformScreen1

我将把这个新检查应用于所有打开的项目,如上一个屏幕快照的“检查”字段所示。 单击“ 浏览 ”按钮,将弹出“ 管理检查 ”窗口,如下一个屏幕快照所示。

netbeans802-manageInspections

点击“ New… ”按钮,允许开发人员在Custom-> Inspection下创建自定义检查。

netbeans802-CustomInspection

您可以单击“编辑脚本”按钮来创建自定义检查,其中包括重命名检查的功能。 我已将检查重命名为“未完成的代码”。 下一个屏幕快照显示了我添加到“未完成代码”检查中的代码。

netbeans802-unfinishedInspectionScript

在此“未完成代码”检查的脚本代码中(也显示在下面)中,说明指定为“未完成代码”。 源模式指定为@dustin.examples.annotations.Unfinished($parameters$) (定义自定义注释的@interface的整个包名称,其中$parameters$表示一个或多个参数)。 =>符号指向目标模式。 在这种情况下,目标模式为空,表示建议的转换将删除@Unfinished批注。 有关NetBeans检查编辑器语法的更多详细信息,请参见Geertjan Wielenga的NetBeans IDE 7.1中的Custom Declarative Hints 。

<!description="Unfinished Code">
@dustin.examples.annotations.Unfinished($parameters$)
=>
;;

创建NetBeans检查后,就该尝试一下了。 接下来的两个屏幕快照演示了如何选择要运行的检查以及运行结果。

netbeans802-readyToRunUnfinishedCodeInspection

netbeans802-runningUnfinishedInspection

运行检查的结果是一个示例,说明了我们如何结合使用NetBeans和自定义注释来快速标识带注释的代码并对其进行适当处理。

在IntelliJ IDEA中检查@未完成的注释

在IntelliJ IDEA中开始创建自定义批注的一种方法是打开“ 分析->检查代码…” ,然后单击“ 指定检查范围 ”弹出窗口中的“…”按钮,如以下两个屏幕快照所示。

idea14-step01-analyzeInspectCode

idea14-step02-selectEllipseButtonSpecifyInspectionScope

下一个屏幕快照显示“ 检查 ”对话框。

idea14-step03-inspections对话框

刚刚显示的屏幕快照表明未选中“ 结构搜索检查 ”。 选中该复选框(名称“ Structural Search Inspection”右侧的复选框)将导致“ Severity”级别可以选择,并允许添加特定的检查(加号从灰色变为绿色)。

idea14-step04-inspectionsDialog-StructuralInspectionSelected

单击绿色加号( + ),有两个选择:“添加搜索模板…”或“添加替换模板…”。 这里的区别类似于NetBeans在Source-> Inspect and Refactor-> Inspect and Transform…之间的区别。在这里,我将重点介绍“ Replace template ”。

idea14-step05-searchOrReplaceOptions

选择“添加替换模板…”时,将显示“ 结构替换 ”对话框。

idea14-step06-structuralReplaceDialog

在这里创建自定义检查的最简单方法是适应现有模板。 单击“ 复制现有模板... ”按钮即可完成此操作。 对于为此博客文章创建的两次检查,我分别复制了现有模板的“带注释的类 ”和“带注释的方法 ”,以创建自己的自定义模板“未完成的类”和“未完成的方法”。

idea14-step07-existingTemplates-annotatedClass

idea14-step08-existingTemplates-annotatedMethod

上面的屏幕快照显示了我复制的“现有模板”,下面的屏幕快照显示了我从中为“未完成的类”和“未完成的方法”创建的自定义模板。

idea14-step09-customTemplate-UnfinishedClass

idea14-step10-customTemplate-UnfinishedMethod

对于每个自定义模板(“未完成的类”和“未完成的方法”),我需要单击“ 编辑变量... ”按钮,并为每个变量(正反两面标有$的标识符)指定正则表达式。搜索。 对于大多数变量(例如类名,方法名等),我使用“所有字符”正则表达式( 。* ),但是对于每个模板中的$Annotation$ ,我均使用dustin.examples.annotations.Unfinished 。 下一个屏幕快照是该快照的代表性示例,其中显示了“未定义方法”模板的注释变量设置。

idea14-step11-customTemplate-UnfinishedMethodAnnotationVariable

我可以使用分析->按名称运行检查...来运行我的任何新检查。 接下来的三个屏幕快照演示了如何运行新的“未完成的方法”检查。

idea14-step12-customTemplate-runInspectionByName

idea14-step13-customTemplate-runStructuralSearchInspection

idea14-step14-unfinishedMethodInspectionResults

运行检查的结果是一个示例,说明了如何结合使用IntelliJ IDEA和自定义批注来快速识别已批注的代码并对其进行适当处理。

结论

这篇文章演示了使用NetBeans和IntelliJ IDEA的功能来创建自定义检查,以创建检查来警告开发人员其代码中存在自定义注释。 该帖子演示了一个简单的@Unfinished批注,以及如何在NetBeans和IntelliJ IDEA中应用自定义检查以帮助识别使用这些批注的代码。

翻译自: https://www.javacodegeeks.com/2015/11/applying-ide-inspections-to-custom-java-annotations.html

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

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

相关文章

有什么用_app用什么软件编写

自己咋开发APP这得看你的学习程度了&#xff0c;如果你学了安卓开发那么久按照教程来吧&#xff0c;如果没有学过&#xff0c;那么就看看我的回答是不是贴题意的。比较快的开发app方式。接入任意后台&#xff0c;通过HBuilder封装成app。2.使用MUI&#xff0c;借用官方的组件代…

java函数的笔记

java函数的笔记 java中&#xff0c;函数即方法。也就是实现某个功能的办法。 函数的格式 修饰符 返回值类型 函数名(参数类型 参数) { 逻辑处理; return 处理结果; // return关键字是用于结束该函数的&#xff0c;并将处理结果返回给调用者。void类型可以省略return&#xff0…

jquery手写轮播图_15个超强的jQuery/HTML5图片轮播插件

最近我们为大家分享过不少基于jQuery的图片轮播插件&#xff0c;当然也有很多使用了HTML5和CSS3的相关技术&#xff0c;让整个图片播放器显得更加美观&#xff0c;动画效果显得更加炫酷。这次我们特意为大家筛选了一些最新的jQuery/HTML5图片轮播插件&#xff0c;每一个的功能都…

NLOG配置

<?xml version"1.0" encoding"utf-8" ?><nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"> <!-- See https://github.com/nlog/nlog/wiki/Config…

gwt格式_GWT –利弊

gwt格式我喜欢JavaScript。 随着jQuery和Mootools的出现&#xff0c;我对JavaScript的热爱倍增 。 如果有选择&#xff0c;我将对开发的任何Web应用程序使用上述任一框架。 但是进入服务行业后&#xff0c;我不得不一次次屈服于客户的压力&#xff0c;并在他们选择技术的过程中…

sap获取系统时间_获取系统当前时间

NSString *appKey(){// // 获取系统当前时间// NSDate * date [NSDate date];// NSTimeInterval sec [date timeIntervalSinceNow];// NSDate * currentDate [[NSDate alloc] initWithTimeIntervalSinceNow:sec];//// //设置时间输出格式&#xff1a;// NSDateFormatter * d…

Git 初始化版本库

创建带工作区的版本库 在开始一个新项目时&#xff0c;首先就要创建并初始化代码库。如果是在本机的工作目录中&#xff0c;那么&#xff1a; $ git init 也就够用了。如果想要初始化的版本库不在当前目录&#xff0c;需要为 git init 命令指定版本库所在的目录&#xff1a; $ …

Spring中的值注释中的占位符支持

Value批注中的${...}占位符用于访问在PropertySource注册的属性。 这对于Spring应用程序中的Configuration bean非常有用&#xff0c;但不仅如此。 为确保可行&#xff0c; PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程序上下文中。 在此博客文…

1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...

零基础学习Python能学会吗?这个问题几乎是所有初学Python的小白都会问到的问题。其实Python是非常适合初学者入门的&#xff0c;相较于其他主流类编程语言&#xff0c;Python具有更好的可读性&#xff0c;因此上手更容易&#xff0c;而且即便你是零基础也一样能学会。献给Pyth…

elisa标准曲线怎么做_ELISA标准曲线绘制

● 设置标准曲线样品的标准浓度范围要有一个比较大的跨度&#xff0c;并且要能涵盖你所要检测实验样品的浓度&#xff0c;样品的浓度要在标准曲线浓度范围之内&#xff0c;包括上限和下限。而对于呈S型的标准曲线&#xff0c;尽量要使实验样品的浓度在中间坡度最陡段&#xff0…

如果今天完成,ESB会是什么样子?

JavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和HOL 。 我最喜欢的会议之一实际上是&#xff1a;关于ESB&#xff08;如果今天完成的话&#xff09;的样子。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…

线程间的通信 设置线程等待与线程唤醒

代码实现上述框图&#xff1a; 1 //等待唤醒机制2 3 /*4 wait(),notify(),notifyAll()必须用在同步中&#xff0c;因为同步中才有锁。5 指明让持有那个锁的线程去等待或被唤醒&#xff0c;例如object.wait(),表明让持有object这把锁的线程等待。6 7 wait():让线程进入等待状态&…

python sys干嘛的_Python之sys模块

Sys模块函数之多&#xff0c;我只能选取自己认为比较实用的一些函数列在此处。借马云找员工的说法,”找最合适的而不是最天才的”&#xff0c;这句话&#xff0c;我个人觉得在很多方面都能适应&#xff0c;学习也不在话下。Sys模块功能的确很多&#xff0c;但我们应该将重点放在…

centos6.8升级python3.5.2

1.查看系统python版本 [rootmyserver01 Python-3.5.2]# python -V Python 2.6.6 2.升级3.5.2 A.下载&#xff1a;wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 或者在浏览器下载&#xff08;选择Linux/UNIX平台&#xff0c;选择3.5.2版本&#xff09; B.编译…

gwt的mvp模式_GWT MVP变得简单

gwt的mvp模式GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC&#xff0c;它在视图和逻辑之间进行划分&#xff0c;并有助于创建结构良好&#xff0c;易于测试的代码。 为了帮助像我这样的懒惰开发人员&#xff0c;我研究了如何减少使用声明式UI时要编…

简记用ArcGIS处理某项目需求中数据的步骤

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤&#xff1a; a.矢量化 b.获取范围内要素 c.合并要素 d.简化要素 e.获取范围外要素。 2. 矢量化 新建图层 开启编辑&am…

从python学编程pdf_教孩子学编程-Python语言版 PDF 高清完整版 网盘资源分享

提取码&#xff1a;2hrr内容简介 本书属于no starch的经典系列之一&#xff0c;英文版在美国受到读者欢迎。本书全彩印刷&#xff0c;寓教于乐&#xff0c;易于学习&#xff1b;读者可以轻松与快递地掌握解决问题方法和程序设计思维的。“编程从孩子抓起”得到越来越多的…

vertical-align属性详解

vertical-align属性详解:http://www.cnblogs.com/wcp-spring/archive/2013/03/04/2942456.html 关于vertical-align属性&#xff1a;http://www.cnblogs.com/hykun/p/3937852.html 对于vertical-align&#xff1a;middle&#xff1b;的使用&#xff1a;http://www.tuicool.com/…

企业应用程序集成简介

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

python实现用户输入用户名和密码不能为空_Python学习【第四篇】用户输入及判断...

用户输入:例1。写一个小程序为用户输入密码。流程如下:1。用户输入其用户名2。输出\u201CHello 用户名\\/usr\/bin\/env python # name raw_input(\u201C你叫什么名字?\u201D)只在pythonname # 输入(\u201C你叫什么名字?\u201D)打印(\u201CHello\u201D名字)例2。当输入一个密…