美文网首页
一个基于编译时注解的Demo

一个基于编译时注解的Demo

作者: xclh | 来源:发表于2019-04-08 17:38 被阅读0次

    上一篇文章,我们使用运行时注解实现了一个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

    大功告成。下班了~~~

    相关文章

      网友评论

          本文标题:一个基于编译时注解的Demo

          本文链接:https://www.haomeiwen.com/subject/yaspiqtx.html