起首,我们梳理下一般处理器处理逻辑:
- 遍历获得源铝闼楝须要解析的元素列表。
- 断定元素是否可见和相符请求。
- 组织数据构造获得输出类参数。
- 输入生成java文件。
- 缺点处理。
然后,让我们懂得一个概念:Element,因为它是我们获取注解的基本。
Processor处理过程中,会扫描全部Java源码,代码的每一个部分都是一个特定类型的Element,它们像是XML一层的层级机构,比如类、变量、办法等,每个Element代表一个静态的、说话级其余构件,如下方代码所示。
是不是很熟悉,有点ButterKnife的味道?当然,ButterKnife比这个高等多,毕竟反射多了影响效力,不过我们明白了,可以经由过程注解来注入和创建对象,如许可以在必定程度节俭代码量。
作为Android开辟中熟知的注解,Override只是注解的一种表现,更多时刻,注解还有以下感化:
- 降低项目标耦合度。
- 主动完成一些规律性的代码。
- 主动生成java代码,减轻开辟者的工作量。
个中,Element代表的是源代码,而TypeElement代表的是源代码中的类型元素,例如类。然而,TypeElement并不包含类本身的信息。你可以大年夜TypeElement中获取类的名字,然则你获取不到类的信息,例如它的父类。这种信息须要经由过程TypeMirror获取。你可以经由过程调用elements.asType()获取元素的TypeMirror。
1、知道了Element,我们就可以经由过程process 中的RoundEnvironment去获取,扫描到的所有元素,如下图X2.4,经由过程env.getElementsAnnotatedWith,我们可以获取被@BindView注解的元素的列表,个中validateElement校验元素是否可用。

- package android.demo; // PackageElement
- // TypeElement
- public class DemoClass {
- // VariableElement
- private boolean mVariableType;
- // VariableElement
- private VariableClassE m VariableClassE;
- // ExecuteableElement
- public DemoClass () {
- }
- // ExecuteableElement
- public void resolveData (Demo data //TypeElement ) {
- }
- }
2、因为env.getElementsAnnotatedWith返回的,是所有被注解了@ BindView的元素的列表。所以有时刻我们还须要走一些额外的断定,比如,检查这些Element是否是一个类:
- @Override
- public boolean process(Set<? extends TypeElement> an, RoundEnvironment env) {
- for (Element e : env.getElementsAnnotatedWith(BindView.class)) {
- // 检查元素是否是一个类
- if (ae.getKind() != ElementKind.CLASS) {
- ...
- }
推荐阅读
人工智能的将来到底应当是什么样的?它应当朝着什么偏向成长?在成长的过程中应当留意什么?这些都是每一个存眷科技成长的人在思虑的问题。比来,O'Reilly Media 开创人兼 CEO Tim O'Reil>>>详细阅读
本文标题:Android注解快速入门和实用解析
地址:http://www.17bianji.com/lsqh/37700.html
1/2 1

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