如何在Gradle了中自定义一个注解处理器

2024-08-25 07:08

本文主要是介绍如何在Gradle了中自定义一个注解处理器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要记录了两部分

  1. Java中预定义好的Annotation的类型
  2. 如何实现一个自定义注解和使用

Java中预定义好的Annotation的类型

Java 语言中自定义的一些注释
  1. @Deprecate
  2. @Override
  3. @SuppressWarnings,告诉编译器,禁止抛出一些警告。Java中有两大类警告deprecationunchecked. 例如,@SuppressWarnings({"unchecked", "deprecation"})
  4. @SafeVarargs,当构造器和方法中,认为不会出现不安全的参数。
  5. @FunctionalInterface,在Java SE8 中,被声明为函数式的接口。
能够用于注射中的注释
  1. @Retention@Retention标记注释是如何存储的
    1. RetentionPolicy.SOURCE – 标记该注释只会在源代码中,而不会出现在编译后的文件中;
    2. RetentionPolicy.CLASS – 标记该注释会在编译后保留,但是在JVM中会被忽视;
    3. RetentionPolicy.RUNTIME – 标记该注释会保留在JVM中,会在程序运行的时候使用。
  2. @Documented @Documented 文档注释
  3. @Target @Target 标记被标记的注释能够用于Java中的那些字段和属性上
    • ElementType.ANNOTATION_TYPE 可以用于注释上.
    • ElementType.CONSTRUCTOR 可以用于构造器
    • ElementType.FIELD 可以用于属性字段
    • ElementType.LOCAL_VARIABLE 可以用于本地变量.
    • ElementType.METHOD 可以用于方法.
    • ElementType.PACKAGE can be applied to a package declaration.
    • ElementType.PARAMETER 可以用于方法的形参
    • ElementType.TYPE 可以用于Class中的任意元素上.
  4. @Inherited @Inherited 标示可以从父类的注解中继承属性(默认为fasle)。当用户使用该注解,如何标记的类上没有任何的注解,则会从父类中查找。该注解只能用于Class级别的注解。
  5. @Repeatable @Repeatable Java8之后,表示该注解可以在同一个元素上使用多次,详见 Repeating Annotations.

如何自定义实现一个注解处理器

下面的例子是一个类似于Lombok中的注解。自定义一个@BuilderProperty注解,作用于Filed属性上,用于生成Builder构造器模式

当然了,Lombok 已经有了@Builder 注解用于实现我们的需求,但是这里主要是熟悉这个流程

public class Person {private int age;private String name;@BuilderPropertypublic void setAge(int age) {this.age = age;}@BuilderPropertypublic void setName(String name) {this.name = name;}
}
// 生成效果是可以使用
Person person = new PersonBuilder().setAge(23).setName("zhangsan").build();

整理一个晚上,也算是最终实现了,具体里面的细节可能还需要各位亲们自己完善一下。

运行环境

  1. Gradle 6.6+
  2. Java 11+

参考的教程中是通过maven构建的多模块来构建的,我这里参考了一些其他资料,如下的设计可能更加的合理。

将项目分为3个模块。 annotation/annotation-processor/demo。

  1. annotation 模块用于编写注解
  2. annotation-processor 模块用于编写对应的注解处理器
  3. demo 用于实际上使用的注解的样例代码

因为我们的注解主要是用于生成一个Java源文件,所以,我们只希望在编译的过程中,才使用。所以项目之间的依赖关系如下

#	annotation build.gradle
dependencies {
}# annotation-processor build.gradle
dependencies {compileOnly project(':annotation')compileOnly 'com.google.auto.service:auto-service:1.0-rc2'annotationProcessor 'com.google.auto.service:auto-service:1.0-rc2'
}# demo build.gradle
dependencies {compileOnly project(':annotation')annotationProcessor project(':annotation-processor')
}

实现一个注解处理器的两个步骤:1. 自定义实现 AbstractProcessor接口;2. 另外一个就是注册自定义的注解处理器注解。上面的:auto-service依赖就是Google提供的注解和注解处理器来简化我们的注册流程。

annotation 模块下的注解代码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface BuilderProperty {
}

Annotation-processor 模块下的代码如下:

@SupportedAnnotationTypes("top.ilovestudy.annotation.BuilderProperty")
@SupportedSourceVersion(SourceVersion.RELEASE_11)
@AutoService(Processor.class)
public class BuilderProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {//    ..... 	 具体的实现就查看下方提供的源码吧return true;}
}

@SupportedAnnotationTypes 说明注解处理器用来绑定哪一个注解,@SupportedSourceVersion 用来指定支持的Java版本,下面的 @AutoService(Processor.class) 就是google提供的简化注册的注解。如果不想引用google的注解,可以查看文献5中,注册的方法。

还有很多,就不啰嗦了,直接提供源码用于参考,点击下方下载

如果觉得有些帮助,点个赞再走吧😊。Gitee地址/ 项目提交快照.zip

Gitee 上分支上的代码可能会随着不断的提交而变的不那么的清晰,建议直接下载对应的zip包文件,更加的清晰。

参考文献


  1. 疯狂Java讲义(第2版)-李刚编著-微信读书
  2. An introductory guide to annotations and annotation processors
  3. Java Annotation Processing and Creating a Builder | Baeldung
  4. Predefined Annotation Types (The Java™ Tutorials > Learning the Java Language > Annotations)
  5. (看完之后觉得比较全且质量较高的中文资料)自定义Java注解处理器

这篇关于如何在Gradle了中自定义一个注解处理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104886

相关文章

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请