java处理注释_如何处理Java注释

java处理注释

Java 8的一项很酷的新功能是对lambda表达式的支持。 Lambda表达式在很大程度上依赖于FunctionalInterface 注释

在本文中,我们将介绍注释以及如何处理它们,以便您可以实现自己的出色功能。

注解

Java 5中添加了注释 。Java语言附带了一些预定义的注释 ,但是您也可以定义自定义注释 。

许多框架和库都充分利用了自定义注释。 例如, JAX-RS使用它们将POJO转换为REST资源。

注释可以在编译时或在运行时(或什至两者)进行处理。

在运行时,您可以使用反射API 。 可以注释的Java语言的每个元素(如类或方法)都实现AnnotatedElement接口。 请注意,只有具有RUNTIME RetentionPolicy的注释才可以在运行时RUNTIME

编译时注释处理

Java 5附带了单独的apt工具来处理注释,但是自Java 6起,此功能已集成到编译器中。

您可以直接从命令行调用编译器,例如从命令行调用,也可以从程序间接调用。

在前一种情况下,您可以为javac指定-processor选项 ,或者通过将文件META-INF/services/javax.annotation.processing.Processor到jar META-INF/services/javax.annotation.processing.Processor来使用ServiceLoader框架。 该文件的内容应为一行,其中包含处理器类的完全限定名称。

ServiceLoader方法在自动构建中特别方便,因为您要做的就是在编译过程中将注释处理器放在类路径上,而Maven或Gradle之类的构建工具将为您提供帮助。

从应用程序内部进行编译时注释处理

您还可以使用编译时工具从正在运行的应用程序中处理注释。

与其直接调用javac ,不如使用更方便的JavaCompiler接口。 无论哪种方式,您都需要使用JDK而不是JRE运行应用程序。

JavaCompiler接口使您能够以编程方式访问Java编译器。 您可以使用ToolProvider.getSystemJavaCompiler()获得此接口的实现。 此方法对JAVA_HOME环境变量敏感。

JavaCompilergetTask()方法允许您添加注释处理器实例 。 这是控制注释处理器构造的唯一方法。 调用注释处理器的所有其他方法都要求处理器具有公共的无参数构造函数。

注释处理器

处理器必须实现Processor接口。 通常,您将需要扩展AbstractProcessor基类,而不是从头开始实现接口。

每个注释处理器必须通过getSupportedAnnotationTypes()方法指示其感兴趣的注释类型。 您可以返回*以处理所有注释。

另一个重要的事情是指出您支持的Java语言版本。 重写getSupportedSourceVersion()方法并返回RELEASE_x常量之一。

使用这些方法,注释处理器就可以开始工作了。 处理器的作用在process()方法中。

process()返回true ,处理的注释被这个处理器权利 ,并且将不被提供给其它处理器。 通常,您应该与其他处理器配合使用并返回false

元素和类型镜

注释和它们所在的Java元素作为Element对象提供给process()方法。 您可能需要使用Visitor模式处理它们 。

元素最有趣的类型是用于类和接口(包括注释)的TypeElement ,用于方法的ExecutableElement和用于字段的VariableElement

每个Element指向一个TypeMirror ,它表示Java编程语言中的一种类型。 您可以使用TypeMirror来遍历正在处理的带注释的代码的类关系,就像在JVM中运行的代码上使用反射一样。

加工回合

注释处理发生在称为rounds的单独阶段中。 在每个回合中,处理器都有机会处理其感兴趣的注释。

可通过传递到process()方法中的RoundEnvironment参数获得要处理的注释及其上存在的元素。

如果注释处理器在一轮中生成新的源文件或类文件,则编译器将使这些文件可用于下一轮处理。 这一直持续到不再生成新文件为止。

最后一轮不包含任何输入,因此是释放处理器可能已获取的任何资源的好机会。

初始化和配置处理器

注释处理器使用ProcessingEnvironment 初始化 。 此处理环境使您可以创建新的源文件或类文件 。

它还以选项的形式提供对配置的访问。 选项是键值对,您可以使用-A option在命令行上提供给javac 。 为此,必须在处理器的getSupportedOptions()方法中返回选项的键。

最后,处理环境提供了一些在处理过程中派上用场的支持例程(例如, 获取元素的JavaDoc或获取类型的直接超类型 )。

类路径问题

为了在注释处理过程中获得最准确的信息,您必须确保所有导入的类都在类路径上,因为引用不可用类型的类可能具有不完整的信息或完全缺少信息。

当处理大量带注释的类时,这可能会在Windows系统上导致命令行太大 (> 8K)的问题。 即使使用JavaCompiler接口,它仍会在后台调用javac

Java编译器有一个很好的解决方案:您可以使用包含javac 参数的参数文件 。 然后,在命令行上提供参数文件的名称,并在@之前。

不幸的是, JavaCompiler.getTask()方法不支持参数文件,因此您必须使用基础的run()方法。

请记住, getTask()方法是唯一一种允许您构造注释处理器的方法。 如果必须使用参数文件,则必须使用公共的无参数构造函数。

如果遇到这种情况,并且有多个注释处理器需要共享一个类的单个实例,则无法将该实例传递给构造函数,因此将被迫使用诸如Singleton模式之类的东西。

结论

注释是一项令人兴奋的技术,具有许多有趣的应用程序。 例如,我使用它们将REST API中的资源提取到资源模型中,以进行进一步处理,例如生成文档。

翻译自: https://www.javacodegeeks.com/2015/01/how-to-process-java-annotations.html

java处理注释

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

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

相关文章

nginx tcp转发_Nginx学习(九):负载均衡服务

介绍对于请求而言,负载均衡能很好的均摊请求,提高服务端吞吐率和整体性能,多个服务节点部署的方式,也提高了容灾和服务高可用。一、负载均衡分类负载均衡分为:GSLB和SLB。1. GDLB全局负载均衡,往往按照国家…

控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

前言在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了原因。创建控制台应用打开命令…

C语言函数为什么不能返回数组?

C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void)[8] {char ret; // ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10]; obj_a f(); }不可以编写这样的代码这其实就是不…

mockito_书评:Mockito Essentials

mockitoSujoy Acharya的Mockito Essentials副标题( Packt出版 ,2014年10月)是:“实用指南,可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

python3 byte 字面值_bytearray() Python 内置函数

转载须注明出处:简书Orca_J35 | GitHuborca-j35 class bytearray([source[, encoding[, errors]]]) 该内置函数本质上是 bytearray 类的构造函数,用于创建一个 bytearray 实例。bytearray 实例是一个由字节(8-bits 无符号)构成的可变序列,并拥…

python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...

之前小编给大家介绍了用python去返回了一个值,立马就有小伙伴跟小编留言说道“能都执行多个内容?”于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下吧~直接上代码&#xff…

Java EE 8怎么了? (第2部分)

Java EE 8的工作仍处于初期阶段,并有望在来年跟上发展步伐,届时我们将看到专家组的完成,围绕用例/功能的更多讨论,大量JIRA和各种规范的草案版本(本会很有趣!)。 在第1部分中 ,我们…

C语言中quot;##quot;的独特用法

市面上有很多比较火的编程语言,比如Python、 JAVA、 Go等,你可能觉得C语言很古老、很落后。如果你有这种想法,那可能你只是一个初学的菜鸟。可能绝大部分 C 程序员都不知道"##"隐藏用法,下面就来给大家讲讲。一、##的“…

html a标签去掉下划线_如何用HTML基本元素制作表格

第2天【HTML基本元素】主要内容标题标签段落标签强制换行水平线图片超链接文本格式化标签列表表格学习目标一、标题标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。标题很重要请…

mysql忽略数据类型_MYSQL 常用数据类型

数字列类型数字列类型用于储存各种数字数据&#xff0c;如价格、年龄或者数量。数字列类型主要分为两种&#xff1a;整数型和浮点型。所有的数字列类型都允许有两个选项&#xff1a;UNSIGNED和ZEROFILL。选择UNSIGNED的列不允许有负数&#xff0c;选择了ZEROFILL的列会为数值添…

C语言中几个容易踩的“坑”!

今天给大家分享几个C语言中的坑。一、带参数的宏展开顺序#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a)int main(void) {printf("%s\n",h(f(1,2)));printf("%s\n",g(f(1,2)));return 0; }运行结果:12f(1,2)浅析&#xff1a;本题中的#运…

java 拼图_我最喜欢的Java拼图2 + 1 = 4

java 拼图这是我当前最喜欢的Java难题。 您如何获取代码来执行此操作&#xff1f; Integer b 2; Integer c 1;System.out.println("bc : " (bc) ); // output: bc : 4 !!Sytem.out.println&#xff08;&#xff09;没有技巧&#xff0c;也就是说&#xff0c;您将…

dockerfile cd目录_使用Werf和现有的Dockerfiles改善你的CI/CD体验

迟到总比不到好。该故事讲关于我们因不支持使用常规的Dockerfile来构建镜像导致我们差点犯了一个重大错误。Werf[1]是一个GitOps工具&#xff0c;可以很好地集成到任何CI/CD系统中&#xff0c;并提供完整的应用程序生命周期管理&#xff0c;允许你&#xff1a;构建和推送镜像部…

alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断

机器在语言编码转换的时候&#xff0c;经常会出现各种各样的异常&#xff0c;这些神奇的字符串就有可能组合成一堆乱码出来&#xff0c;也有可能直接把程序搞崩溃掉&#xff0c;不过总有那么一些字符&#xff0c;可以帮助我们在利用漏洞的时候变得更简单一些&#xff0c;下面我…

C语言,去你的策略模式!

前言 这里先插一点题外话&#xff0c;在C语言中&#xff0c;实现封装、继承、隐藏、多态等等特性&#xff0c;是完全没有问题的。但是在使用过程中&#xff0c;必定是不如自带这些特性的语言方便好用的&#xff0c;比如C \java等。一旦要通过C语言来实现各种设计模式&#xff0…

eager_EAGER的获取是代码的味道

eager介绍 Hibernate获取策略确实可以使几乎没有爬网的应用程序和响应Swift的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 &#xff1a; 提取策略 描述 加入 原始S…

什么时候会是用treeset?_flex:1 到底代表什么?

今天在做项目的时候遇到一个关于布局的问题, 就是 flex: 1; 我一直以为 flex: 1; 代表的是 flex: aoto; 后来发现结果并不是这样, 所以写一篇博客来讲解一下 flex: 1; 代表什么代码第一版<div class"container"><div class"div">我是一个div&l…

纠缠不清的C语言位域(位段)详解

位域是什么&#xff1f;有些数据在存储时并不需要占用一个完整的字节&#xff0c;只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态&#xff0c;用 0 和 1 表示足以&#xff0c;也就是用一个二进位。正是基于这种考虑&#xff0c;C语言又提供了一种叫做位域的…

matlab画累计直方图_科学网—matlab 绘制直方图——常用命令 - 范凯波的博文

直方图上显示数值close all ,x rand(100,1);%获得直方图的数据[n,y] hist(x);maxN max(n);%设置显示x,y长度限制axis([0 1.2 0 maxN2])%根据直方图的数据绘制出图形bar(y,n);for i 1:length(y)%直方图上面数据对不齐&#xff0c;利用水平和垂直对齐 &#xff0c;可以参考se…

玩转java并发工具_玩Java并发

玩转java并发工具最近&#xff0c;我需要将一些文件&#xff08;每个文件都有JSON格式的对象列表&#xff08;数组&#xff09;&#xff09;转换为每个文件都具有相同数据&#xff08;对象&#xff09;的分隔行的文件。 这是一次性的任务&#xff0c;很简单。 我使用Java nio的…