如何在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

相关文章

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(