Android APT的使用
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 下面看到生成的类了
相关文章:
Android APT的使用
Apt 介绍 APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation,根据注解自动生成代码。 Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annot…...
【刷题宝典NO.0】
目录 素数的判定 打印素数 打印水仙花数 百钱买百坤 输出闰年 逆序打印一个整数的每一位 输出乘法口诀表 数字9出现的次数 二进制1的个数 输出一个整数的偶数位和奇数位的二进制序列 求两个整数的最大公约数 求两个整数的最小公倍数 小乐乐与欧几里得 小…...
MySQL数据库——存储过程-介绍以及基本语法(特点、创建、调用、查看、删除、示例)
目录 介绍 特点 基本语法 创建 调用 查看 删除 示例 介绍 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理…...
基础课15——语音标注
语音数据标注是对语音数据进行处理和分析的过程,目的是让人工智能系统能够理解和识别语音中的信息。这个过程包括了对语音信号的预处理、特征提取、标注等步骤。 在语音数据标注中,标注员需要对语音数据进行分类、切分、转写等操作,让人工智…...
Linux启动故障排错
Linux启动过程 开机流程、模块管理-CSDN博客 Grub三个阶段 1st stage:执行Grub主程序。Grub安装在MBR。由于MBR太小,所以与配置文件分开放1.5 stage:识别不同的文件系统2nd stage:加载Grub配置文件 /boot/grub2/grub.cfg。配置…...
全新二开游戏支付通道/话费/电网、紫水晶带云端源码
源码修复可用,YY业务都可用 本店所售程序只供测试研究,不得使用于非法用途,不得违反国家法律,不得用于进行违法行为,否则后果自负!购买以后用作他用附带的一切法律责任后果都由购买者承担于本店无任何关…...
Hadoop相关知识点
文章目录 一、主要命令二、配置虚拟机2.1 设置静态ip2.2 修改主机名及映射2.3 修改映射2.4 单机模式2.5 伪分布式2.6 完全分布式 三、初识Hadoop四、三种模式的区别4.1、单机模式与伪分布式模式的区别4.2、特点4.3、配置文件的差异4.3.1、单机模式4.3.2、伪分布式模式4.3.3、完…...
Javassist讲解1(介绍,读写字节码)
Javassist讲解1(介绍,读写字节码) 介绍一、读写字节码1.如何创建新的类2.类冻结 介绍 javassist 使Java字节码操作变得简单,它是一个用于在Java中编辑字节码的类库; 它使Java程序能够在运行时定义一个新类,…...
【Linux】常见指令以及具体其使用场景
君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,随着博主的学习,博主掌握的技能也越来越多,今天又根据最近的学习开设一个新的专栏——Linux,相信Linux操作系…...
后台管理(二)
1、权限控制 如果没有权限控制,系统的功能完全不设防,全部暴露在所有用户面前。用户登录以后可以使用系统中的所有功能。这是实际运行中不能接受的,所以权限控制系统的目标就是管理用户行为,保护系统功能。 1.1、 定义资源 资源就…...
反转链表II(C++解法)
题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出:[1…...
记一次 logback 没有生成独立日志文件问题
背景 在新项目发布后发现日志文件并没有按照期望的方式独立开来,而是都写在了 application.log 文件中。 问题展示 日志文件: 项目引入展示: <include resource"paas/sendinfo/switch/client/sendinfo-paas-switch-client-log.…...
数据库强化(1.视图)
1.什么是视图 视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的…...
Mysql与SeaweedFS数据不同步问题产生原因及解决办法
文章目录 Mysql与SeaweedFS数据不同步问题的探究与解决问题背景原因探究不一致的写操作缺乏事务管理 解决方案引入分布式事务处理使用消息队列 实践演示(python代码)结论 Mysql与SeaweedFS数据不同步问题的探究与解决 问题背景 在数据库和文件存储系统…...
Kotlin apply和with用法和区别
apply apply 是 Kotlin 标准库中的一个函数,它允许你在对象上执行一系列操作,然后返回该对象自身。它的语法结构如下: fun <T> T.apply(block: T.() -> Unit): T这个函数接受一个 lambda 表达式作为参数,该 lambda 表达…...
springboot通过aop自定义注解@Log实现日志打印
springboot通过aop自定义注解Log实现日志打印 文章目录 效果图实操步骤1.引入依赖2.自定义日志注解3.编写日志切面类4.UserController5.运行 效果图 实操步骤 注意,本代码在springboot环境下运行,jdk1.8 1.引入依赖 <dependency><groupId>…...
k8spod详解其二
一,资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为…...
golang包的管理
Go语言中包的使用 Go语言使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java 、python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得“先进…...
Windows10安装Anaconda与Pytorch的记录
这是一篇关于安装Anaconda和Pytorch的记录与复盘,写的原因是我电脑恢复系统之后东西全没了,再装Pytorch的时候一脸懵逼忘了怎么弄了,写篇记录以备我下一次安装。 1、Anaconda的安装 1.1、Anaconda安装包下载 下载链接: Free Download | An…...
图解Kafka高性能之谜(五)
高性能的多分区、冗余副本集群架构 高性能网络模型NIO 简单架构设计: 详细架构设计: 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引: 高响应的磁盘拷贝技术 kafka采用sendFile()的…...
拯救B站缓存视频:3分钟学会m4s转mp4的终极方案
拯救B站缓存视频:3分钟学会m4s转mp4的终极方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾在B站缓存了珍贵的视频内容&a…...
Go并发读写竞争漏洞:结构体赋值引发的密钥泄露
1. 这不是段子,是真实发生的“裸奔”现场CVE-2026-27944——这个编号刚在NVD(美国国家漏洞库)公开时,我正盯着一台生产环境的API网关日志发呆。它没报错,没超时,但每分钟有3700次请求在返回200的同时&#…...
终极指南:如何用Awoo Installer一站式解决Switch游戏安装兼容性问题
终极指南:如何用Awoo Installer一站式解决Switch游戏安装兼容性问题 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安…...
Adobe全系列软件激活指南:5分钟掌握GenP 3.0终极破解技巧
Adobe全系列软件激活指南:5分钟掌握GenP 3.0终极破解技巧 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 你是否在为Adobe Creative Cloud的高昂订阅费用…...
AI Agent 在工具调用失败时,如何设计一个智能的降级策略?
这个问题挺关键的,工具调用失败在 AI Agent 系统里是常态,不是异常。核心思路是——先分类,再分级,最后兜底。 我之前做 Agent 编排系统的时候,工具调用成功率大概在 85% 左右,剩下 15% 都得靠降级策略兜住。如果没设计好,整个 Agent 就会频繁报错,用户体验很差。 第一步:错误…...
终极指南:使用Xenos实现Windows进程DLL注入的完整教程
终极指南:使用Xenos实现Windows进程DLL注入的完整教程 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 在Windows系统开发和安全研究中,DLL注入技术是实现进程监控、调试和功能扩展的核心手段。…...
别再抄网上报错的代码了!手把手教你用Python搞定波士顿房价预测(附数据集下载)
从零构建波士顿房价预测实战指南:避开99%初学者踩过的坑第一次运行波士顿房价预测代码时,我也遇到了那个经典的报错——load_boston()函数突然失效。这就像准备大展拳脚时发现工具箱被锁住,特别是当截止日期临近,那种焦虑感尤为真…...
高阶信息度量:总相关性与O信息在特征工程与数据压缩中的应用
1. 从信息论到机器学习:为什么我们需要更精细的“相关性”度量如果你做过机器学习项目,尤其是涉及高维数据特征工程或者模型解释性分析时,大概率会碰到一个头疼的问题:我们如何量化一组特征变量之间的“整体关系”?传统…...
Kerr相干态:从非线性量子光学到光子晶格模拟的实现路径
1. 引言:从经典光场到非线性量子相干态 在量子光学的研究中,相干态是一个基石性的概念。它最初由罗伊格劳伯在1960年代引入,用以描述激光器输出的光场。简单来说,一个理想的单模激光,其量子态就可以用一个相干态来极好…...
量子机器学习可解释性:从黑箱到透明决策的LRP与数字孪生方法
1. 量子机器学习可解释性:从黑箱到透明决策量子机器学习(QML)这几年火得不行,但说实话,很多从业者,包括我自己在内,最初接触时都有点“懵”。模型性能上去了,可它到底是怎么做决策的…...
