上一篇博客讨论了关于注解的基础知识,以及运行时(Runtime)通过反射机制来处理注解,但既然是Runtime,那么总会有效率上的损耗,如果我们能够在编译期(Compile time)就能处理注解,那自然更好,而很多框架其实都是在编译期处理注解,比如大名鼎鼎的bufferknife,这个过程并不复杂,只需要我们自定义注解处理器(Annotation Processor)就可以了。(Annotation Processor下文有些地方直接简称处理器,不要理解成cpu那个处理器)。
在Compile time注解就能起作用,这才是真正体现注解价值的地方,不过自定义Compile time的注解处理器也没什么神秘的。注解处理器是编译器(javac)的一个工具,它用来在编译时扫描和处理注解。我们可以自定义一个注解,并编写和注册对应的处理器。在写法上它其实就是我们自定义一个类,该类 extends javax.annotation.processing.AbstractProcessor
, AbstractProcessor
是一个abstract的基类。它以我们写好的java源码或者编译好的代码做为输入,然后就可以通过处理器代码来实现我们所希望的输出了,比如输出一份新的java代码,此时注解管理器就以递归的形式进行多趟处理,直到把代码(包括你手写的代码,以及注解处理器生成的代码)中所有的注解都被处理完毕。
我们已经写好的代码固然是不能修改了,但是这并不影响通过注解处理器来生成新的代码。还以bufferknife为例,写findViewById实在太无聊了,所以我们就使用了bufferknife的注解方式省略这个过程。
public class TestMainActivity extends BaseActivity { @BindView(R.id.mainSwitchGoneBtn) Button goneBtn; ....... }
但是实际上呢,是bufferknife通过其注解处理器器来生成了相应的代码,它生成的文件是这样的:
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26