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

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与