美文网首页
android 安卓 自定义APT注解

android 安卓 自定义APT注解

作者: 灰斗儿 | 来源:发表于2024-07-31 17:56 被阅读0次

    自定义APT注解,需要创建一个注解和注解处理器,还需要配合谷歌的一个注解@AutoService

    由于注解处理器注解依赖 AbstractProcessor,而该类android没有,java有,所以还要创建一个java module, 注解和注解处理器都是创建在 java module内的。

    先看一下需要的东西大概的样子

    注解

    package com.abc.asdfa;
    
    ...
    
    @Retention(RetentionPolicy.SOURCE)
    @Target(ElementType.TYPE)
    public @interface HHA {
        String value() default  "222";
    }
    
    

    我们知道java 文件会被编译为class文件,然后被jvm加载。
    RetentionPolicy.SOURCE //编译class时期使用,变成class文件后注解会被删除
    RetentionPolicy.RUNTIME //不管时java文件还是class文件注解一直都在,被jvm加载后也依然存在
    RetentionPolicy.CLASS 与RUNTIME不同的是,被jvm加载后,注解会被删除

    注解处理器

    package com.abc.asdfa;
    
    ...
    @AutoService(Processor.class) 
    public class MyClass extends AbstractProcessor {
        @Override
        public synchronized void init(ProcessingEnvironment processingEnvironment) {
            super.init(processingEnvironment);
            System.out.println("ProcessingEnvironment");
        }
    
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            System.out.println("process");
            return true;
        }
    
        @Override
        public SourceVersion getSupportedSourceVersion() {
            return SourceVersion.latestSupported();
        }
    
       
        @Override
        public Set<String> getSupportedAnnotationTypes() {
            HashSet<String> types = new LinkedHashSet<>();
            types.add(HHA.class.getCanonicalName());
            return types;
        }
    }
    
    

    AutoService类依赖 需要导入 com.google.auto.service:auto-service:1.0-rc7

    详细流程

    Android Studio -> File -> NewModule

    截屏2024-08-01 17.32.18.png

    左侧一定要选Java or Kotlin Library

    然后点Finish,我这里创建过了,不能重复创建了,这里包跟现有最外层的包 同级

    截屏2024-08-01 17.38.39.png

    修改com.abc.asdfa包的build.gradler, 然后执行sync

    plugins {
        id 'java-library'
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    
    dependencies {
        implementation "com.google.auto.service:auto-service:1.0-rc7"
        annotationProcessor "com.google.auto.service:auto-service:1.0-rc7"
    
    }
    

    然后在com.abc.asdfa 包内,分别创建一个注解和注解处理器

    创建注解


    截屏2024-08-01 17.41.09.png 截屏2024-08-01 17.42.50.png

    HHA 为注解名称, 下面一定要选 Annotation

    package com.abc.asdfa;
    
    ...
    
    @Retention(RetentionPolicy.SOURCE)
    @Target(ElementType.TYPE)
    public @interface HHA {
        String value() default  "222";
    }
    
    

    创建注解处理器

    ###   注解处理器
    
    package com.abc.asdfa;
    
    ...
    @AutoService(Processor.class) 
    public class AAAClass extends AbstractProcessor {
        @Override
        public synchronized void init(ProcessingEnvironment processingEnvironment) {
            super.init(processingEnvironment);
            System.out.println("ProcessingEnvironment");
        }
    
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            System.out.println("process");
            return true;
        }
    
        @Override
        public SourceVersion getSupportedSourceVersion() {
            return SourceVersion.latestSupported();
        }
    
       
        @Override
        public Set<String> getSupportedAnnotationTypes() {
            HashSet<String> types = new LinkedHashSet<>();
            types.add(HHA.class.getCanonicalName());
            return types;
        }
    }
    
    

    @AutoService(Processor.class) 别写错了参数, Processor是谷歌包内部类

    然后需要在主app包内的build.gradle 新增以下修改,然后执行sync

    dependencies {
    
        ...
        implementation project(":asdfa")
        annotationProcessor project(":asdfa")
    }
    

    为某个Activity 加载新增的注解

    @HHA()
    public class MainActivity extends AppCompatActivity {
      ...
    }
    

    运行项目,你将在build日志中看到 ProcessingEnvironment的输出字样

    注意是build日志,不是logcat日志

    注解案例

    为Activity绑定一个字符串到全局map中

    常见问题

    1. 注解处理器为什么不执行
    • 检查主app包,是否导入的注解包,且以 annotationProcessor 函数名导入的,annotationProcessor 就是告诉编译器要在编译时载入
    • 注解处理器是否实现了getSupportedAnnotationTypes,并返回要处理的注解内容

    相关文章

      网友评论

          本文标题:android 安卓 自定义APT注解

          本文链接:https://www.haomeiwen.com/subject/ramnhjtx.html