内容简介: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 有 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 压缩解决方案(一)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Seasoned Schemer
Daniel P. Friedman、Matthias Felleisen / The MIT Press / 1995-12-21 / USD 38.00
drawings by Duane Bibbyforeword and afterword by Guy L. Steele Jr.The notion that "thinking about computing is one of the most exciting things the human mind can do" sets both The Little Schemer (form......一起来看看 《The Seasoned Schemer》 这本书的介绍吧!