Android APT的使用

news/2024/10/24 5:18:14/

Apt 介绍

APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation,根据注解自动生成代码。 Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annotation 处理器的编写者决定),APT 还会编译生成的源文件和原来的源文件,将它们一起生成 class 文件。我们 Android 常用的库如 Dagger2, ButterKnife, EventBus3 等都使用了 APT 的技术。

本篇通过一个简单的 Android 路由的项目来介绍 APT 相关内容和进行 APT 开发的大致流程。

使用 APT 开

发自动生成路由表的库

首先我们创建一个名字为 route-annotation 的 module,定义 APT 需要处理的注解。

  • 在创建一个名字为 route-compiler 的 module 实现一个注解处理器。

  • @SupportedAnnotationTypes 表示我们需要处理哪些注解

  • @SupportedSourceVersion 表示我们生成的代码是 Java 的哪个版本

  • 类会封装成 TypeElement

  • 方法会被封装成 ExecuteableElement

  • 字段会被封装成 VariableElement

  • element.getEnclosingElement();// 获取父元素

  • element.getEnclosedElements();// 获取子元素

在 module 对应的 build.gradle 里添加一下依赖

下面就来创建我们的处理器 RouteProcessor

我们需要创建一个名为 RouteProcessor 的类继承 AbstractProcessor,并添加三个注解 @AutoService@SupportedAnnotationTypes@SupportedSourceVersion

然后我们一般需要重写 AbstractProcessor 的两个方法 init(ProcessingEnvironment processingEnv)process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment),通过 init 方法的 processingEnv 我们可以得到一些辅助类, 通过 process 的 roundEnvironment 我们可以得到被注解对象(Element)的集合,相关代码如下

这里介绍下 Element 的概念, 注解处理器会把我们注解的方法、字段、类等等封装成一个 Elment 的对象,

然后我们可能通过这个对象获取被注解对象的信息(如方法的参数和返回值、字段的类型和名字等等),并且这些 Element 元素还相当于 XML 中的 DOM 树,通过相关方法可以访问它的父元素或者子元素。

如下面这段代码,通过 Element 获取需要的信息

我们通过注解对象的信息用 javapoet 这个库来生成相关的代码

  • 最后我在需要是用 route 的 module 使用我们上面写好的库

在 build.gradle 增加相关依赖

在需要的被路由的 Activity 声明 @Route 的注解

  • Make Project 一下就能在 build/generated/source/apt/debug 下面看到生成的类了


http://www.ppmy.cn/news/1194644.html

相关文章

【vscode远程开发】使用内网穿透实现在公网环境下远程访问

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

瑞禧生物分享~今天是 碲化银粉体 Ag2Te CAS:12002-99-2

碲化银粉体 Ag2Te CAS&#xff1a;12002-99-2 纯度&#xff1a;99% 仅用于科研 储藏条件&#xff1a;冷藏-20℃ 简介&#xff1a;碲化银是一种无机化合物&#xff0c;化学式是Ag2Te。它是一种单斜晶体&#xff0c;并以矿物的形式存在于自然界中。化学计量的碲化银具有n型半导…

Spring底层原理(六)

Spring底层原理(六) 本章内容 介绍AOP的实现方式、JDK代理的模拟实现与源码 AOP的实现方式 使用代理模式 jdk动态代理cglib动态代理 使用aspectj的编译器&#xff0c;该编译器会直接对字节码进行修改&#xff0c;可以实现静态方法增强 使用javaagent,在jvm option中指定-…

FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理

FANUC机器人PRIO-621和PRIO-622设备和控制器没有运行故障处理 如下图所示&#xff0c;新的机器人开机后提示报警&#xff1a; PRIO-621 设备没有运行 PRIO-622 控制器没有运行 我们首先查看下手册上的报警代码说明&#xff0c;如下图所示&#xff0c; 如下图所示&#xff0c…

通过终端命令实现本地文件与远程Git仓库的上传与拉取!

​要将本地文件上传到Git仓库&#xff0c;需要遵循以下步骤&#xff1a; 初始化仓库&#xff08;如果尚未初始化&#xff09;&#xff1a; 导航到包含你的项目文件的文件夹&#xff0c;打开命令行(windows)或终端(git) git终端下载&#xff1a;Git的下载与安装教程_git下载安…

传智杯-21算法赛初赛B组题目详细解法解析-AB题(C/C++、Python、Java)

🚀 欢迎来到 ACM 算法题库专栏 🚀 在ACM算法题库专栏,热情推崇算法之美,精心整理了各类比赛题目的详细解法,包括但不限于ICPC、CCPC、蓝桥杯、LeetCode周赛、传智杯等等。无论您是刚刚踏入算法领域,还是经验丰富的竞赛选手,这里都是提升技能和知识的理想之地。 ✨ 经典…

MySQL中的空格处理

在处理数据库查询时&#xff0c;我们常常会遇到一些看似简单但实际上需要注意的细节。今天&#xff0c;我们将深入探讨MySQL中的空格处理&#xff0c;以及如何在Java中有效地处理这些问题。 1. MySQL中的空格 在MySQL中&#xff0c;空格是一个特殊的字符&#xff0c;其ASCII值…

华纳云:ubuntu系统如何建立软连接?

在Ubuntu中&#xff0c;您可以使用ln命令来创建软连接&#xff08;符号链接&#xff09;。软链接是指向另一个文件或目录的引用&#xff0c;类似于Windows中的快捷方式。创建软链接的语法如下&#xff1a; ln -s /path/to/source /path/to/link 其中&#xff1a; /path/to/s…