编写 APT

66 阅读1分钟

step1 定义注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Test {
    String value();
    String name() default "";
}

step2 新建 Java lib

1685235403361.png

step3

新建类继承 AbstractProcessor,并实现 process 方法

@SupportedAnnotationTypes("com.lixuanlin.aptapplication.Test")//关心注解的全类名
public class AptProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Messager messager = processingEnv.getMessager();
        messager.printMessage(Diagnostic.Kind.NOTE,"=====================");
        //可以额外生成辅助类
        return false;
    }
}

step4 注册 Processor

main 目录下创建 resources/META-INF/services/javax.annotation.processing.Processor

1685239304558.png

javax.annotation.processing.Processor 内容是注解处理程序的全类名

1685239344581.png

tips:

目录必须是 main/resources/META-INF/services/javax.annotation.processing.Processor 而不是 META-INF.services 否则不会触发注解处理程序,虽然 Android Studio 中显示的是 META-INF.services ,但实际目录结构是 /META-INF/services

tips:

自动注册

dependencies {
    implementation 'com.google.auto.service:auto-service:1.0-rc6'
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
}
@AutoService(Processor.class)//自动注册
public class AptProcessor extends AbstractProcessor {

5.5.0 以上 gradle 版本不兼容 auto-service

step5 使用注解

annotationProcessor project(':lib')

kotlin 项目
kapt project(':lib')

注解的作用时间

注解作用在 javac 阶段,javac采集注解信息 -> Element -> 注解处理程序