上一篇博客讨论了关于注解的基础知识,以及运行时(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通过其注解处理器器来生成了相应的代码,它生成的文件是这样的:

        		

网友评论