AbstractProcessor使用小结

本文介绍如何使用google auto-service库自动生成注册信息。通过在build.gradle中添加依赖和annotationProcessor,确保目标类能够正确生成。同时,需要为自定义的Processor类添加@AutoService(Processor.class)注解。

1、没有注册信息,也就没有目标类生成

使用 google auto-service

添加依赖,一定别忘了加 annotationProcessor,auto-service 的原理是找到被@AutoService标记的自己写的Processor,然后生成注册信息,如果没依赖 annotationProcessor 就没有注册信息,也就没有目标类生成

build.gradle

dependencies {
     implementation 'com.google.auto.service:auto-service:1.0-rc5'
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'

}

2、给Processor添加 @AutoService(Processor.class) 注解,@AutoService的参数一定要写死 Processor.class,不要写自己的 Annotation.class

 

@AutoService(Processor.class) 
public class TestProcessor extends AbstractProcessor


 

 

AbstractProcessorJava 中用于编译时注解处理的核心类。编译时注解是在编译阶段进行处理的注解,与运行时注解相比,能避免一些性能问题。编译时注解的核心依赖 APT(Annotation Processing Tools)实现,其原理是在代码元素(如类型、函数、字段等)上添加注解,编译时编译器会检查 AbstractProcessor 的子类,并调用其 process 函数,将添加了注解的所有元素传递到该函数中,开发人员可在编译器进行相应处理,如根据注解生成新的 Java 类,这也是 EventBus、Retrofit、Dragger 等开源库的基本原理[^1]。 ### 使用方法 - **继承 AbstractProcessor 类**:Java API 提供了扫描源码并解析注解的框架,开发人员可以继承 AbstractProcessor 类来实现自己的解析注解逻辑。 - **实现 process 方法**:在继承的类中重写 process 方法,该方法会在编译时被调用,编译器会将添加了注解的所有元素传递到这个方法中。 - **在 Android Studio 中使用**:可以通过创建名为 processor 的 module 来进行相关开发,以便在 Android 项目中使用编译时注解生成 Java 文件[^1]。 ### 示例 下面是一个在编译前对源码中所有带有特定注解的 bean 自动生成相应序列化和反序列化实现的示例代码: ```java import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import java.util.Set; // 指定支持的注解类型 @SupportedAnnotationTypes("com.example.JsonType") // 指定支持的 Java 版本 @SupportedSourceVersion(SourceVersion.RELEASE_8) public class JsonProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(JsonType.class); for (Element element : elements) { if (element instanceof TypeElement) { processTypeElement((TypeElement) element); } } return false; } private void processTypeElement(TypeElement element) { // 处理带有 JsonType 注解的元素 // 这里可以添加具体的处理逻辑,如生成序列化和反序列化代码 } } ``` ### 开发测试方法 在开发过程中,若想看到编译后的代码效果,可以在 AbstractProcessor 代码上加上断点,然后使用 maven debug 启动。因为是在编译时生成代码,所以 debug 启动 maven 编译会进入断点,之后在 IDE(如 IntelliJ IDEA)里就可以看到编译好的 class 类,其中包含增强的代码块。若找不到 target 目录,可查看 Settings→Editor→File Types,检查下方的忽略文件和目录(Ignore files and folders)是否已经被自己忽略了[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值