作家
登录

Android如何编写基于编译时注解的项目

作者: 来源: 2017-05-26 14:06:10 阅读 我要评论

  •     @Override 
  •     public synchronized void init(ProcessingEnvironment processingEnv){ 
  •         super.init(processingEnv); 
  •         mFileUtils = processingEnv.getFiler(); 
  •         mElementUtils = processingEnv.getElementUtils(); 
  •         mMessager = processingEnv.getMessager(); 
  •     } 
  •     @Override 
  •     public Set<String> getSupportedAnnotationTypes(){ 
  •         Set<String> annotationTypes = new LinkedHashSet<String>(); 
  •         annotationTypes.add(BindView.class.getCanonicalName()); 
  •         return annotationTypes; 
  •     } 
  •     @Override 
  •     public SourceVersion getSupportedSourceVersion(){ 
  •         return SourceVersion.latestSupported(); 
  •     } 
  •     @Override 
  •     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ 
  •     } 
  • 在实现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.收集信息

    1. private Map<String, ProxyInfo> mProxyMap = new HashMap<String, ProxyInfo>(); 
    2. @Override 
    3. public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){ 
    4.     mProxyMap.clear(); 
    5.     Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(BindView.class); 

        推荐阅读

        Python算法实战系列:栈

      栈(stack)又称之为客栈是一个特别的有序表,其插入和删除操作都在栈顶进行操作,并且按照先辈后出,落后先出的规矩进交运作。如下图所示例如枪的弹匣,第一颗放进弹匣的枪弹反而在发射出去>>>详细阅读


      本文标题:Android如何编写基于编译时注解的项目

      地址:http://www.17bianji.com/lsqh/35453.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)