美文网首页
Annotations 1

Annotations 1

作者: 比目鱼26 | 来源:发表于2017-02-23 12:46 被阅读0次

    Annotations Processing

    概念

    Annotation processing-javac在编译时扫描、处理Annotation的工具。对于特定的注解可以注册对应的annotation processor。

    特定注解的注解处理器以java code作为输入.java文件作为输出。可以理解成在编译时生成想要的.java文件,生成的.java文件和其他手写的.java文件一样会被javac编译。

    NOTE:仅仅是生成,注解处理器并不能修改已经存在的对象,比如增加一个方法

    AbstractProcessor

    自定义Processor需要继承java内置的AbstractProcessor,比较重要的几个方法如下

    package com.wsl;
    public class MyProcessor extends AbstractProcessor {
        @Override
        public synchronized void init(ProcessingEnvironment env){ }
        @Override
        public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
        @Override
        public Set<String> getSupportedAnnotationTypes() { }
        @Override
        public SourceVersion getSupportedSourceVersion() { }
    }
    
    • init(ProcessingEnvironment env): 每个annotation processor class必须有一个空构造函数。init()方法被注解处理器调用,ProcessingEnvironment 参数提供了一些很有用的工具类,比如Elements、Types和Filer,稍后会用到。
    • process(Set<? extends TypeElement> annotations, RoundEnvironment env):每个注解处理器最主要的方法,生成java文件的逻辑就是在这里完成的。RoundEnvironment 参数可以查询被注解过的元素。
    • getSupportedAnnotationTypes(): 注解处理器注册对应的Annotations
    • getSupportedSourceVersion(): 指定java version,一般情况下 return SourceVersion.latestSupported()即可,或者也可以return其他版本,比如SourceVersion.RELEASE_6.

    如果java7以上版本可以用@SupportedSourceVersion、@SupportedAnnotationTypes代替getSupportedAnnotationTypes() 和 getSupportedSourceVersion()

    @SupportedSourceVersion(SourceVersion.latestSupported())
    @SupportedAnnotationTypes({
       // Set of full qullified annotation type names
     })
    public class MyProcessor extends AbstractProcessor {
        @Override
        public synchronized void init(ProcessingEnvironment env){ }
        @Override
        public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
    }
    

    NOTE: 考虑到编译的兼容性问题(特别是Android),推荐重载getSupportedAnnotationTypes() 和 getSupportedSourceVersion()

    Annotation Processor运行在自己的jvm里,javac会开启一个jvm来运行注解处理器,这就意味着可以添加一些第三方依赖库,比如guava

    Register Processor

    需要提供一个jar,jar包括MyProcessor和javax.annotation.processing.Processor,如下:

    MyProcessor.jar
    - com
    - example
    - MyProcessor.class
    - META-INF
    - services
    - javax.annotation.processing.Processor

    javax.annotation.processing.Processor的作用是告诉javac用到了哪些Processor,如下

    com.example.MyProcessor
    com.foo.OtherProcessor
    net.blabla.SpecialProcessor
    

    可把MyProcessor.jar当作第三方Library来使用即可

    相关文章

      网友评论

          本文标题:Annotations 1

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