然后拿到对应的类信息TypeElement,继而生成ProxyInfo对象,这里经由过程一个mProxyMap进行检查,key为qualifiedName即类的全路径,如不雅没有生成才会去生成一个新的,ProxyInfo邮攀类是一一对应的。
一、概述
在Android应用开辟中,我们经常为了晋升开辟效力会选择应用一些基于注解的框架,然则因为反射造成必定运行效力的损耗,所以我们会更青睐于编译时注解的框架,例如:
- butterknife免除我们编写View的初始化以及事宜的注入的代码。
- EventBus3便利我们实现组建间通信。
- fragmentargs轻松的为fragment添加参数信息,并供给创建办法。
- ParcelableGenerator可实现主动将随便率性对象转换为Parcelable类型,便利对象传输。
类似的库还有异常多,大年夜多这些的库都是为了主动帮我们完成日常编码中须要反复编写的部分(例如:每个Activity中的View都须要初始化,每个实现Parcelable接口的对象都须要编写很多固定写法的代码)。

这里并不是说上述框架就必定没有应用反射了,其实上述个中部分框架内部照样有部分实现是依附于反射的,然则很少并且一般都做了缓存的处理,所以相对来说,效力影响很小。
然则在应用这类项目标时刻,有时刻出现缺点会难声调试,重要原因照样很多用户并不懂得这类框架其内部的道理,所以碰到问题时会消费大年夜量的时光去排查。
那么,于情于理,在编译时注解框架这么火的时刻,我们有来由去进修:若何编写一个机会编译时注解的项目
起首,是为了懂得其道理,如许在我们应用类似框架碰到问题的时刻,可以或许找到精确的门路去排盘考题;其次,我们如不雅有好的设法主意,发明某些代码须要反复创建,我们也可以本身来写个框架便利自谷旦常的编码,晋升编码效力;最后也算是自身技巧的晋升。
注:以下应用IDE为Android Studio.
本文将以编写一个View注入的框架为线索,具体介绍编写词攀类框架的步调。
在编写词攀类框架的时刻,一般须要建立多个module,例如本文即将实现的例子:
- ioc-annotation 用于存放注解等,Java模块
- ioc-compiler 用于编写注解处理器,Java模块
- ioc-api 用于给用户供给应用的API,本例为Andriod模块
- ioc-sample 示例,本例为Andriod模块
那么除了示例认为,一般要建立3个module,module的名字你可以本身推敲,上述给出了一个简单的参考。当然如不雅前提许可的话,有的开辟者爱好将存放注解和API这两个module归并为一个module。
对于module间的依附,因为编写注解处理器须要依附相存眷解,所以:
- ioc-compiler依附ioc-annotation
我们在应用的过程中,会用到注解以及相干API
- 所以ioc-sample依附ioc-api;ioc-api依附ioc-annotation
三、注解模块的实现
注解模块,重要用于存放一些注解类,本例是模板butterknife实现View注入,所以本例只须要一个注解类:
- @Retention(RetentionPolicy.CLASS)
- @Target(ElementType.FIELD)
- public @interface BindView
- {
- int value();
- }
我们设置的保存策略为Class,注解用于Field上。这里我们须要在应用时传入一个id,直接以value的情势进行设置即可。
你在编写的时刻,分析本身须要几个注解类,并且精确的设置@Target以及@Retention即可。
定义完成注解后,就可以去编写注解处理器了,这块有点复杂,然则也算是有章可循的。
二、编写前的预备
该模块,我们一般会依附注解模块,以及可以应用一个auto-service库
如许对着膳绫擎代码看会好很多,其实就逝世根据收集到的成员变量(经由过程@BindView声明的),然后根据我们具体要实现的需求去生成java代码。
build.gradle的依附情况如下:
- dependencies {
- compile 'com.google.auto.service:auto-service:1.0-rc2'
- compile project (':ioc-annotation')
- }
auto-service库可以帮我们去生成META-INF等信息。
(1)根本代码
注解处理器一般持续于AbstractProcessor,刚才我们说有章可循,是因为部分代码的写法根本是固定的,如下:
- @AutoService(Processor.class)
- public class IocProcessor extends AbstractProcessor{
- private Filer mFileUtils;
- private Elements mElementUtils;
- private Messager mMessager;
推荐阅读
栈(stack)又称之为客栈是一个特别的有序表,其插入和删除操作都在栈顶进行操作,并且按照先辈后出,落后先出的规矩进交运作。如下图所示例如枪的弹匣,第一颗放进弹匣的枪弹反而在发射出去>>>详细阅读
地址:http://www.17bianji.com/lsqh/35453.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示