本文主要是介绍如何在Gradle了中自定义一个注解处理器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文主要记录了两部分
- Java中预定义好的Annotation的类型
- 如何实现一个自定义注解和使用
Java中预定义好的Annotation的类型
Java 语言中自定义的一些注释
- @Deprecate
- @Override
- @SuppressWarnings,告诉编译器,禁止抛出一些警告。Java中有两大类警告
deprecation
和unchecked
. 例如,@SuppressWarnings({"unchecked", "deprecation"})
。 - @SafeVarargs,当构造器和方法中,认为不会出现不安全的参数。
- @FunctionalInterface,在Java SE8 中,被声明为函数式的接口。
能够用于注射中的注释
- @Retention
@Retention
标记注释是如何存储的RetentionPolicy.SOURCE
– 标记该注释只会在源代码中,而不会出现在编译后的文件中;RetentionPolicy.CLASS
– 标记该注释会在编译后保留,但是在JVM中会被忽视;RetentionPolicy.RUNTIME
– 标记该注释会保留在JVM中,会在程序运行的时候使用。
- @Documented
@Documented
文档注释 - @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中的任意元素上.
- @Inherited
@Inherited
标示可以从父类的注解中继承属性(默认为fasle)。当用户使用该注解,如何标记的类上没有任何的注解,则会从父类中查找。该注解只能用于Class级别的注解。 - @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();
整理一个晚上,也算是最终实现了,具体里面的细节可能还需要各位亲们自己完善一下。
运行环境
- Gradle 6.6+
- Java 11+
参考的教程中是通过maven构建的多模块来构建的,我这里参考了一些其他资料,如下的设计可能更加的合理。
将项目分为3个模块。 annotation/annotation-processor/demo。
- annotation 模块用于编写注解
- annotation-processor 模块用于编写对应的注解处理器
- 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包文件,更加的清晰。
参考文献
- 疯狂Java讲义(第2版)-李刚编著-微信读书
- An introductory guide to annotations and annotation processors
- Java Annotation Processing and Creating a Builder | Baeldung
- Predefined Annotation Types (The Java™ Tutorials > Learning the Java Language > Annotations)
- (看完之后觉得比较全且质量较高的中文资料)自定义Java注解处理器
这篇关于如何在Gradle了中自定义一个注解处理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!