在实现AbstractProcessor后,process()办法是必须实现的,也是我们编写代码的核心部分,后面会介绍。
我们一般会实现getSupportedAnnotationTypes()和getSupportedSourceVersion()两个办法,这两个办法一个返回支撑的注解类型,一个返回支撑的源码版本,参考膳绫擎的代码,写法根本是固定的。
如许就完成了信息的收集,收集完成信息后,应当就可以去生成代劳类了。
除此以外,我们还会选择复写init()办法,该办法传入一个参数processingEnv,可以赞助我们去初始化一些父类类:
- Filer mFileUtils; 跟文件相干的帮助类,生成JavaSourceCode.
- Elements mElementUtils;跟元素相干的帮助类,赞助我们去获取一些元素相干的信息。
- Messager mMessager;跟日记相干的帮助类。
这里简单提一下Elemnet,我们简单熟悉下它的几个子类,根据下面的注释,应当已经有了一个简单认知。
(2)process的实现
process中的实现,比拟较会比较复杂一点,一般你可以认为两个大年夜步调:
- 收集信息
- 生成代劳类(本文把编译时生成的类叫代劳类)
四、注解处理器的实现
什么叫收集信息呢?就是根据你的注解声明,拿到对应的Element,然后获取到我们所须要的信息,这个信息肯定是为了后面生成JavaFileObject所预备的。
例如本例,我们会针对每一个类生成一个代劳类,例如MainActivity我们会生成一个MainActivity$$ViewInjector。那么如不雅多个类中声清楚明了注解,就对应了多个类,这里就须要:
- 一个类对象,代表具体某个类的代劳类生成的全部信息,本例中为ProxyInfo
- 一个集合,存放上述类对象(到时刻遍历生成代劳类),本例中为Map,key为类的全路径。
这里的描述有点模糊没紧要,一会结合代码就好懂得了。
a.收集信息
- private Map<String, ProxyInfo> mProxyMap = new HashMap<String, ProxyInfo>();
- @Override
- public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
- mProxyMap.clear();
- Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(BindView.class);
推荐阅读
栈(stack)又称之为客栈是一个特别的有序表,其插入和删除操作都在栈顶进行操作,并且按照先辈后出,落后先出的规矩进交运作。如下图所示例如枪的弹匣,第一颗放进弹匣的枪弹反而在发射出去>>>详细阅读
地址:http://www.17bianji.com/lsqh/35453.html
1/2 1

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