一个基于编译时注解的Demo

2019-04-08  本文已影响0人  xclh

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

项目结构

项目结构

这是整个项目的结构,annomation是我们存放注解的地方,APLibrary是我们注解处理器实现的部分,app这个就是我们演示效果的Demo啦

他们之间的依赖关系是:APLibrary-》annomation,app-》APLibrary,app-》annomation。

注解模块的实现

这里就不说注解的基本情况啦,直接看代码吧~

成员变量的注解 方法的注解

注解处理器的实现

首先我们看下APLibrary的build.gradle,我们这里添加了一个auto-service,

APLibrary的build.gradle

这个就是在用来自动生成

图1

的,不用我们管~

好来,上注解器的代码:

注解器的代码

好了,我们可以看出我们继承AbstractProcessor复写了他的四个方法,上面都有注释,就不多做解释了

主要来看process这个方法,主要就是用来获取注解信息和生成文档的了。

我们先来看getFieldData和getMethodData这个方法。

成员变量注解 方法注解

注意,上面的ProxyInfo是我们自己创建的一个专门收集信息的类。

那我们来看下这个类的主要方法吧

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

~~~一下子清晰了哇。

至于怎么使用的哈。

我在app项目里建了一个代理类

其中ViewInjector是个接口

使用的话,直接

好啦,完成。效果图和我另一篇文章的效果图类似--》效果图

项目地址:https://github.com/prentent/ClassAnnotation.git

参考文档:https://blog.csdn.net/lmj623565791/article/details/51931859

大功告成。下班了~~~

上一篇下一篇

猜你喜欢

热点阅读