文章目录

  • 一、注解处理器 AbstractProcessor
  • 二、使用注解 @AutoService(Processor.class) 标注 注解处理器
  • 三、注解处理器 init 初始化方法
  • 四、注解处理器 Filer 代码生成工具
  • 五、注解处理器 Messager 日志打印工具
  • 六、博客资源

一、注解处理器 AbstractProcessor


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

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

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

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

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 {@Overridepublic 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 服务库 ,

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 编译器通过查找该注解 , 确定哪个类是注解处理器 ;

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 {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {return false;}
}

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


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

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);
}

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

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

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 对象 ;

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

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


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

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

    /*** 日志打印*/private Messager mMessager;/*** 初始化注解处理器相关工作* @param processingEnv*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);this.mMessager = processingEnv.getMessager();}

六、博客资源


博客源码 :

  • GitHub : https://github.com/han1202012/APT

  • CSDN :

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

  1. 【Android APT】注解处理器 ( 根据注解生成 Java 代码 )

    文章目录 一.生成 Java 代码 二.实现 IButterKnife 接口 三.视图绑定主要操作 四.完整注解处理器代码 五.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 , ...

  2. 【Android APT】注解处理器 ( Element 注解节点相关操作 )

    文章目录 一.获取被 注解 标注的节点 二.Element 注解节点类型 三.VariableElement 注解节点相关操作 四.注解处理器 完整代码示例 五.博客资源 Android APT 学习 ...

  3. 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )

    文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...

  4. Android 注解与注解处理器简述

    Android 注解与注解处理器简述 前言 正文 一.注解 ① 注解类型 ② 注解生命周期 ③ 注解参数 二.注解处理器 ① 注册 ② 配置 三.使用 ① 接口 ② 反射 ③ 使用 ④ 强化 四.源码 ...

  5. 【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )

    文章目录 一.注解节点类型 二.JavaPoet 简介 三.注解处理器中使用 JavaPoet 生成代码 四.路由框架说明 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 ...

  6. 【Android APT】编译时技术 ( 开发编译时注解 )

    文章目录 一.编译时注解 二.编译时注解 使用 三.注解的保留时间 四.博客资源 一.编译时注解 上一篇博客 [Android APT]编译时技术 ( 编译时注解 和 注解处理器 依赖库 ) 中创建并 ...

  7. Android 自定义注解处理器详解

    文章目录 AbstractProcessor 方法详细信息 ProcessingEnvironment 方法详细信息 1 新建 Java Library 1.1 新建 1.2 确定依赖关系 2 创建自 ...

  8. 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后 ...

  9. Java注解 编译_Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

    注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处 ...

最新文章

  1. 为什么程序员要学GC
  2. Android使用ActionBar和ViewPager切换页面
  3. MySQL 高级 - 存储过程 - 概述
  4. C#多线程编程系列(三)- 线程同步
  5. 计算机培训开场语,辅导班家长会主持词开场白
  6. java单例模式之深入浅出
  7. 最大报销额(HDU 1864)
  8. 【Python】快速简单实现图像背景更换
  9. 《乾》: 相时而动的龙精神
  10. EDK II Module Writers Guide上
  11. 第8章.商品详情页面之thymeleaf
  12. 平板安装Ubuntu18.04教程
  13. 【学习笔记】stm32+ESP8266+阿里云+云智能APP
  14. Docker官网浅学---最原汁原味的Docker循序渐进接触之旅
  15. 记手动迁移网站到Centos7、安装lnmp套装踩到的坑
  16. Mysql传智jing_dong数据库
  17. HJ20 密码验证合格程序 Java
  18. RK3399平台开发系列讲解(中断篇)13.13、中断下半部WorkQueue实现原理
  19. 图解分布式之:最终一致性,一致只会迟到,但绝不缺席
  20. 形式语言大作业_清华大学本科一年级设计作业展示|仅是手绘就秒杀我的照片级效果图...

热门文章

  1. linux tunnel 与cisco 三层交换机的tunnel互联
  2. 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」
  3. 数据结构:最大子序列和
  4. Luogu P2920 时间管理【二分答案】
  5. C#模板设计模式使用和学习心得
  6. 中文乱码各个浏览器的处理
  7. iOS 毛玻璃效果的实现方法
  8. (转)关于Linux核心转储文件 core dump
  9. Parallel学习
  10. 静态页面访问缓慢的问题