一个基于编译时注解的Demo
上一篇文章,我们使用运行时注解实现了一个findViewById及setOnClickListener的操作,不过这个呢,是基于运行时的,是通过反射来实现的,而反射对性能又有一定的影响,所以,我们换个思路,基于编译时来实现看看呢。比较成熟的框架有Butter Knife之二类的。好了,不多说,下面开始吧~
项目结构

这是整个项目的结构,annomation是我们存放注解的地方,APLibrary是我们注解处理器实现的部分,app这个就是我们演示效果的Demo啦
他们之间的依赖关系是:APLibrary-》annomation,app-》APLibrary,app-》annomation。
注解模块的实现
这里就不说注解的基本情况啦,直接看代码吧~


注解处理器的实现
首先我们看下APLibrary的build.gradle,我们这里添加了一个auto-service,

这个就是在用来自动生成

的,不用我们管~
好来,上注解器的代码:

好了,我们可以看出我们继承AbstractProcessor复写了他的四个方法,上面都有注释,就不多做解释了
主要来看process这个方法,主要就是用来获取注解信息和生成文档的了。
我们先来看getFieldData和getMethodData这个方法。


注意,上面的ProxyInfo是我们自己创建的一个专门收集信息的类。
那我们来看下这个类的主要方法吧



这样看可能有些空洞,我们看下他生成的文档就清楚了。

~~~一下子清晰了哇。
至于怎么使用的哈。
我在app项目里建了一个代理类

其中ViewInjector是个接口
使用的话,直接

好啦,完成。效果图和我另一篇文章的效果图类似--》效果图
项目地址:https://github.com/prentent/ClassAnnotation.git
参考文档:https://blog.csdn.net/lmj623565791/article/details/51931859
大功告成。下班了~~~