前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android APT】注解处理器 ( 注解标注 与 初始化方法 )

【Android APT】注解处理器 ( 注解标注 与 初始化方法 )

作者头像
韩曙亮
发布2023-03-29 12:44:11
2950
发布2023-03-29 12:44:11
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、注解处理器 AbstractProcessor


上一篇博客 【Android APT】编译时技术 ( 开发编译时注解 ) 中 开发 了 annotation 编译时注解 依赖库 , 很简单 , 只有一个 BindView 注解 ;

本博客开始进行开发 注解处理器 依赖库 ;

【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 ) 博客中创建了 annotation-compiler 注解处理器 依赖库 , 基于该基础开发 注解处理器 ;

创建 Compiler 注解处理器 , 该类主要作用是生成代码 , 注解处理器类必须继承 javax.annotation.processing.AbstractProcessor 类 , 这是 Java 的 API , 再 Android 中无法获取该 API , 因此 编译时注解 和 注解处理器 都必须是 Java 依赖库 ;

代码语言:javascript
复制
package kim.hsl.annotation_compiler;

import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;

/**
 * 生成代码的注解处理器
 */
public class Compiler extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        return false;
    }
}

二、使用注解 @AutoService(Processor.class) 标注 注解处理器


上述实现的 AbstractProcessor 中的 process 方法 , 专门用于搜索 Android 源码中使用的 编译时注解 的方法 ;

程序构建时 , 发现了 annotationProcessor project(path: ':annotation-compiler') 依赖 , 使用 annotationProcessor 进行依赖 , 说明这是一个注解处理器 , 此时会到 annotation-compiler 模块中查找 注解处理器 , 注解处理器 的查找方式也是 通过 注解 标记 进行查找 , 该注解是 Google 服务库提供的 ;

如果要使用 注解 标记注解处理器 , 首先要依赖 Google 服务库 ,

代码语言:javascript
复制
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'
    compileOnly 'com.google.auto.service:auto-service:1.0-rc3'
}

然后到 public class Compiler extends AbstractProcessor 注解处理器类上使用 @AutoService(Processor.class) 标注 , Android 编译器通过查找该注解 , 确定哪个类是注解处理器 ;

代码语言:javascript
复制
import com.google.auto.service.AutoService;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;

/**
 * 生成代码的注解处理器
 */
@AutoService(Processor.class)
public class Compiler extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        return false;
    }
}

三、注解处理器 init 初始化方法


AbstractProcessor 注解处理器中 , 专门提供了一个 init 方法 , 该方法专门用于注解处理器相关初始化操作 ;

代码语言:javascript
复制
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
    super.init(processingEnv);
}

init 方法的 ProcessingEnvironment processingEnv 参数很重要 , 通过该参数可以获取 注解处理器中的各种重要工具 ;

ProcessingEnvironment 中定义了获取相关工具的接口 ;

代码语言:javascript
复制
public interface ProcessingEnvironment {
    Map<String,String> getOptions();
    Messager getMessager();
    Filer getFiler();
    Elements getElementUtils();
    Types getTypeUtils();
    SourceVersion getSourceVersion();
    Locale getLocale();
}

四、注解处理器 Filer 代码生成工具


通过注解生成 Java 代码需要使用 Filer 对象 , 将该对象定义到 注解处理器 成员变量中 , 在 init 方法中进行初始化操作 ;

通过 ProcessingEnvironment 可以通过调用 getFiler 方法 , 获取 Filer 对象 ;

代码语言:javascript
复制
    /**
     * 生成 Java 代码对象
     */
    private Filer mFiler;
    
    /**
     * 初始化注解处理器相关工作
     * @param processingEnv
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        this.mFiler = processingEnv.getFiler();
    }

五、注解处理器 Messager 日志打印工具


注解处理器中不能打断点进行调试 , 也不能使用 Log , System.out 打印日志 , 在注解处理器中只能通过 Messager 打印日志 ;

通过调用 ProcessingEnvironmentgetMessager 方法 , 可以获取到 Messager 对象 ;

代码语言:javascript
复制
    /**
     * 日志打印
     */
    private Messager mMessager;

    /**
     * 初始化注解处理器相关工作
     * @param processingEnv
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        this.mMessager = processingEnv.getMessager();
    }

六、博客资源


博客源码 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、注解处理器 AbstractProcessor
  • 二、使用注解 @AutoService(Processor.class) 标注 注解处理器
  • 三、注解处理器 init 初始化方法
  • 四、注解处理器 Filer 代码生成工具
  • 五、注解处理器 Messager 日志打印工具
  • 六、博客资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档