当前位置:   article > 正文

APT技术屋_apt supportedoptions

apt supportedoptions

一、APT技术

       全称annotations   processor   tool,apt技术是在编译成class文件时进行的。

 

二、apt使用

1、定义注解(创建一个新的java  library)

  1. @Target(ElementType.FIELD)
  2. @Retention(RetentionPolicy.SOURCE)
  3. public @interface ThorAnno {
  4. String value();
  5. }

2、创建注解解析器(创建新的java library)

      2.1、注解解析器类实现抽象类AbstractProcessor,覆写process方法

  1. @SupportedAnnotationTypes("com.thor.lib_annotations.ThorAnno")
  2. @SupportedSourceVersion(SourceVersion.RELEASE_7)
  3. public class ThorProcessor extends AbstractProcessor {
  4. @Override
  5. public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
  6. return false;
  7. }
  8. }

   2.2、注册

   方式一:在main文件夹下新建 resource/META-INF/services/javax.annotation.processing.Processor  如图

                  

  方式二 :谷歌提供了导入包的方式

    在build.gradle下的dependencies下

  1. compileOnly'com.google.auto.service:auto-service:1.0-rc4'
  2. annotationProcessor'com.google.auto.service:auto-service:1.0-rc4'

3、使用在app的build.gradle加入引用annotations工程和注解解析器工程

  1. implementation project(path: ':lib_annotations')
  2. annotationProcessor project(path: ':lib_compiler')

 

三、相关类解析

1、AbstractProcessor

  •      init(ProcessingEnvironment processingEnvironment)
       用于初始化一些参数,参数是ProcessingEnvironment类型
    
  •      getSupportedSourceVersion()   获取java支持的版本
  1. @Override
  2. public SourceVersion getSupportedSourceVersion() {
  3. return SourceVersion.latestSupported();
  4. }

   简便写法:在注解类上添加注解SupportedSourceVersion

  •    getSupportedAnnotationTypes() 获取该注解解析器关注的注解
  1. @Override
  2. public Set<String> getSupportedAnnotationTypes() {
  3. HashSet set=new HashSet();
  4. set.add(ThorAnno.class.getCanonicalName());
  5. return set;
  6. }

   简便写法:在注解类上添加注解SupportedAnnotationTypes

  • process(Set<? extends TypeElement> set,RoundEnvironment roundEnvironment) 用于处理注解
2、ProcessingEnvironment
  1. Messager getMessager(); //用于打印日志
  2. Filer getFiler(); //用于文件写入
  3. Elements getElementUtils(); // 操作Element的工具类(类,函数,属性,其实都是Element)
  4. Types getTypeUtils(); //type(类信息)的工具类,包含用于操作TypeMirror的工具方法

 

四、代码

1、获取options    

  1. @SupportedAnnotationTypes("com.thor.lib_annotations.ThorAnno")
  2. @SupportedSourceVersion(SourceVersion.RELEASE_7)
  3. @SupportedOptions("options_value")
  4. public class ThorProcessor extends AbstractProcessor {
  5. private Messager mMessager;
  6. private String options;
  7. @Override
  8. public synchronized void init(ProcessingEnvironment processingEnvironment) {
  9. super.init(processingEnvironment);
  10. mMessager = processingEnvironment.getMessager();
  11. mMessager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>>>>>>>>>> 初始化");
  12. options = processingEnvironment.getOptions().get("options_value");
  13. }

传递options的值  在app的build.gradle的 le的 defaultConfig节点下

  1. javaCompileOptions {
  2. annotationProcessorOptions {
  3. arguments = [options_value: “111”]
  4. }
  5. }

2、获取被注解的元素

  1. // 获取所有被 @ARouter 注解的 元素集合
  2. Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ThorAnno.class);
  3. for (Element element : elements) {
  4. // 获取类节点,获取包节点 (com.xiangxue.xxxxxx)
  5. String packageName = elementTool.getPackageOf(element).getQualifiedName().toString();
  6. // 获取简单类名,例如:MainActivity
  7. String className = element.getSimpleName().toString();
  8. //获取注解的值
  9. ThorAnno annotation = element.getAnnotation(ThorAnno.class);
  10. String value = annotation.value();
  11. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号