Java注解处理器---------编译时注解

本文介绍了Java注解处理器的工作原理,包括如何通过注解处理器生成代码。讲解了AbstractProcessor类的主要方法,以及如何定义注解和创建注解处理器。通过一个实例展示了注解处理器如何在编译时自动生成辅助类,实现属性注入,简化开发过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解处理
在开发中,碰见很多注解,如@Override、@Documented等,还有像现在很多依赖注入库如ARouter,Dagger 2等·,他的内部如何处理自己的注解,通过什么途径获取自己的注解,实现自己的业务逻辑。看一下ARouter,当添加ARouter依赖后,在需要的Activity添加注解,编译就会看到在build文件夹下生成如下图的文件,文件生成是通过在注解处理器中编写解析和生成代码格式。

在这里插入图片描述
注解处理器:
是一个在javac中的,用来编译时扫描和处理的注解的工具。你可以为特定的注解,注册你自己的注解处理器。
注解处理器可以生成Java代码,这些生成的Java代码会组成 .java 文件,但不能修改已经存在的Java类(即不能向已有的类中添加方法)。而这些生成的Java文件,会同时与其他普通的手写Java源代码一起被javac编译。
注解处理器抽象类AbstractProcessor:

public class AnnotionTest extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
return false;
}
@Override
public Set getSupportedAnnotationTypes() {
return super.getSupportedAnnotationTypes();
}
@Override
public SourceVersion getSupportedSourceVersion() {
return super.getSupportedSourceVersion();
}
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
} }

init(ProcessingEnvironment processingEnvironment)初始化数据,相当于构造器,初始化一些工具类,如下。

Map<String, String> getOptions();
Messager getMessager();
Filer getFiler();
Elements getElementUtils();
Types getTypeUtils();
SourceVersion getSourceVersion();
Locale getLocale();

getSupportedAnnotationTypes()必须重写,指明要注解哪个注解,如

Set setClazzName = new LinkedHashSet<>();
setClazzName.add(TestSelfAnnotation.class.getName());
return setClazzName;

getSupportedSourceVersion()支持的java版本。
process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment)业务逻辑的处理。
如何使用注解处理器:

首先我们需要创建java库,在库中定义自己的注解,如下:

@Documented @Target({ElementType.FIELD}) @Retention(value =
RetentionPolicy.RUNTIME) public @interface TestSelfAnnotation {
int value() default 0; }

创建一个java库,添加如下依赖,编写自己的注解处理器继承AbstractProcessor,生成代码使用JavaPoet库,生成.java源文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值