内容简介:APT 是 Annotation Processing Tool 的缩写,即注解处理器,是一种处理注解的工具。确切的说它是 javac 的一个工具, 它用来在编译时扫描和处理注解。注解处理器以 Java 代码(或者编译过的字节码)作为输入,生成 .java 文件作为输出。 简单来说就是在编译期,通过注解生成 .java 文件。权限控制、代码调试等。我们通过 APT 来实现一个功能,功能类似于 ButterKnife 中的 @BindView 注解。即:通过对 View 变量的注解,实现 View 的绑定(
APT
APT 是 Annotation Processing Tool 的缩写,即注解处理器,是一种处理注解的工具。确切的说它是 javac 的一个工具, 它用来在编译时扫描和处理注解。注解处理器以 Java 代码(或者编译过的字节码)作为输入,生成 .java 文件作为输出。 简单来说就是在编译期,通过注解生成 .java 文件。权限控制、代码调试等。
Element
自定义注解处理器,需要继承 AbstractProcessor 类,而 AbstractProcessor 最终要的就是 process 方法。process 方法 处理的核心是 Element 对象。 Element 的源码源码如下:
从定义可以看出,Element 是一个接口,它定义了外部可以调用的方法。Element 有 5 个直接子类,它们分别代表一种特定类型的元素。五个子类各有各的用处并且有各种独有的方法,在使用的 时候可以强制将 Element 对象转换成其中的任何一种,但是必须满足转换的条件,不然会抛出异常。
其中 TypeElement 和 VariableElement 是最核心的两个 Element,也是我们下文会使用到的。
ATP 实例
我们通过 APT 来实现一个功能,功能类似于 ButterKnife 中的 @BindView 注解。即:通过对 View 变量的注解,实现 View 的绑定(无需调用 findViewById)。
完整的项目源码后续会 release 给大家。
AST
AST,是 Abstract Syntax Tree 的缩写,即“抽象语法树”,是编辑器对代码的第一步加工之后的结果,是一个树形式表示 的源代码。源代码的每个元素映射到一个节点或子树。
Java 的编译过程可以分成三个阶段:
第一阶段:所有的源文件会被解析成语法树;
第二阶段:调用注解处理器,即 APT。如果注解处理器产生了新的源文件,新的源文件也要参与编译;
第三阶段:
语法树会被分析并转化成类文件。
原理概述
编辑器对代码处理的流程大概是:
JavaTXT-> 词语法分析 -> 生成 AST -> 语义分析 -> 编译字节码
通过操作 AST,可以达到修改源代码的功能。
可 以 在 注 解 处 理 器 的 process 函 数 里,通 过 roundEnvironment.getRootEle- ments() 方法可以拿到所有的 Element 对象,通过 trees.getTree(element) 方 法可以拿到对应的抽象语法树(AST),然后我们自定义一个 TreeTranslator, 在 visitMethodDef 里即可对方法进行判断。如果是目标处理方法,则通过 AST 的相关 API 插入埋点代码。
实现步骤
完整的项目源码后续会 release 给大家
知识点
• APT
• AST
缺点
• com.sun.tools.javac.tree 相关 API 语法晦涩,理解难度大,要求对编译原理 有一定的基础
• APT 无法扫描其他 module,导致 AST 无法处理其他 module
• 不支持 Lambda 语法
• 带有返回值的方法,很难把埋点代码插入到方法之后
参考资料
[1] https://www.jianshu.com/p/5514cf705666
[2] https://www.jianshu.com/p/7af58e8e3e18
[3] http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/
[4] http://developer.51cto.com/art/201305/392858.htm
[5] https://juejin.im/entry/5ae06228518825671278334d
[6]http://www.massapi.com/source/bitbucket/20/86/2086842069/- Processor/src/TimeAnnotationProcessor.java.html
注:该内容来自神策数据用户行为洞察研究院出品的《Android 全埋点解决方案》白皮书,查看完整白皮书可点击 《Android 全埋点解决方案》
更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Hadoop小文件解决方案-基于文件整合的解决方案
- Hadoop小文件解决方案-基于NameNode内存和MapReduce性能解决方案
- 跨域解决方案
- 异步解决方案---promise
- 前端一键打印解决方案
- MySQL 压缩解决方案(一)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。