可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ide

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应用程序, @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

可以自定义模板的ide

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

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

相关文章

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能&#xff1a;点击提交按钮的时候都会弹出模态框&#xff0c;但是有不同的状态&#xff1a;审核状态未通过&#xff1a;弹出未通过理由的input输入框&#xff0c;模态框中除了取消和确定按钮&#xff0c;新增确定并保存医院的按钮审核状态已通过&#xff1a…

spock框架_Spock VW:编写自定义的Spock框架扩展

spock框架Spock框架具有多个内置扩展 &#xff0c;这些扩展支持许多核心功能&#xff0c;例如Ignore和Timeout批注。 但更重要的是&#xff0c;鼓励开发人员编写自己的扩展。 例如&#xff0c; SpringExtension很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的…

java log 断点_项目中常见的log日志调用

第一种用法&#xff1a;引用org.apache.commons.logging.Log。import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static final Log logger LogFactory.getLog(PolicyAppBizAction.class); //PolicyAppBizAction.class是自己定义…

侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器

侦听127.0.01介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分&#xff0c;幸运的是&#xff0c;Spring为瞬态事件&#xff08;*&#xff09;提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口&#xff0c;以在实践中检查Spring 4.2中引入的新的…

java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

BPMN的介绍Activiti项目是一项新的基于Apache许可的开源BPM平台&#xff0c;从基础开始构建&#xff0c;旨在提供支持新的BPMN 2.0标准&#xff0c;包括支持对象管理组(OMG)&#xff0c;面对新技术的机遇&#xff0c;诸如互操作性和云架构&#xff0c;提供技术实现。那什么是BP…

javaone_JavaOne 2015 –第二十版十大收获

javaone我们刚刚在旧金山有了JavaOne的第二十版。 这将是我自2004年以来第十二次参加不间断的系列活动。最大的教训是什么&#xff0c;可以揭示Java的未来。 模块化斗争 自从Java 2007首次提到模块以来&#xff0c;已经花费了将近9年的时间&#xff0c;或者说&#xff0c;直到…

java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

Java项目中调用bat批处理配合使用BCP进行多用户数据的备份一、项目需求最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份&#xff0c;而是根据用户来备份&#xff0c;具体的备份策略如下&#xff1a;①系统为某一赛事管理类型的…

mycat和应用程序集成_企业应用程序集成简介

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

java中读取单个字符_如何使用Java中的Scanner类读取单个字符?

从Java 1.5开始引入Scanner类。此类接受File&#xff0c;InputStream&#xff0c;Path和String对象&#xff0c;使用正则表达式逐个令牌读取所有原始数据类型和String(从给定的源)令牌。默认情况下&#xff0c;空格被视为定界符(将数据分成令牌)。使用Scanner类读取字符Scanner…

java中的case1怎么说_Java Cas20ServiceTicketValidator類代碼示例

本文整理匯總了Java中org.jasig.cas.client.validation.Cas20ServiceTicketValidator類的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java Cas20ServiceTicketValidator類的具體用法&#xff1f;Java Cas20ServiceTicketValidator怎麽用&#xff1f;Java Cas20Service…

drill apache_使用Apache Drill深入研究当今的大数据

drill apache自2014年9月首次提供Beta版以来&#xff0c; Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0&#xff0c;此后大量客户在生产中部署和使用了Drill。 在这篇博客文章中&#xff0c;我将简要总结客户在Drill中发现非常宝…

akka 消息发送接收_Akka型演员:探索接收器模式

akka 消息发送接收在上一篇文章中&#xff0c;我们研究了Akka Typed提供的一些基本功能。 在本文和下一篇文章中&#xff0c;我们将更进一步地了解一些其他功能&#xff0c;并通过查看Akka Typed提供的两种不同模式来做到这一点&#xff1a;Receiver和Receptionist模式。 如果您…

scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

这两天在处理支付金额校验的时候出现了点问题&#xff0c;有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等&#xff0c;结果导致金额比较出现错误(比如3.0与3.00的比较等)。【注&#xff1a;以下所讲都是以sun jdk 1.4.2版本为例&#xff0c;其他版本实现未必…

activemq和jms_带有ActiveMQ和Maven的JMS Sender应用程序

activemq和jms我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi&qu…

java初始化hashset_JAVA中的Hashset类

HashSet扩展AbstractSet并且实现Set接口。它创建一个类集&#xff0c;该类集使用散列表进行存储。正像大多数读者很可能知道的那样&#xff0c;散列表通过使用称之为散列法的机制来存储信息。在散列(hashing)中&#xff0c;一个关键字的信息内容被用来确定唯一的一个值&#xf…

java集成lucene_将Lucene搜索集成到应用程序中

java集成lucene本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…

java经纬度曲线简化_JAVA 后台计算 经纬度 最短距离

1、 代码块package com.ilogie.tms.util;import java.io.IOException;import java.math.BigDecimal;import java.text.MessageFormat;public class LocationUtils {// 以下为 获得 两点之间最短距离private static final BigDecimal EARTH_RADIUS MathUtil.toBigDecimal(6378.…

java ee的小程序_在Java EE应用程序中实现自动重试

java ee的小程序最初&#xff0c;我想将此博客称为“ 具有拦截器驱动的重试策略的灵活超时 ”&#xff0c;但后来我认为它太“繁重”。 该声明以及修改后的标题应该&#xff08;希望&#xff09;使您了解此帖子可能谈论的内容;-) 触发 这篇文章主要由我在较早的一篇文章中收到…

Java变长数组笛卡尔积_Java 8中的流作为流的笛卡尔积(仅使用流)

小编典典在示例中传递流永远比传递列表更好&#xff1a;private static Stream cartesian(BinaryOperator aggregator, List... lists) {...}并像这样使用它&#xff1a;Stream result cartesian((a, b) -> a b,Arrays.asList("A", "B"),Arrays.asLis…

jboss eap 7_EAP 7 Alpha和Java EE 7入门

jboss eap 7红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它建立在WildFly等经过验证的创新开源技术之上&#xff0c;这将使Java EE 7的开发更加容易。 这是有关如何开始使用最新ALPHA…