APT技术屋

一、APT技术

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

 

二、apt使用

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface ThorAnno {
    String value();
}

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

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

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

   2.2、注册

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

                  

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

    在build.gradle下的dependencies下

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

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

implementation project(path: ':lib_annotations')
annotationProcessor project(path: ':lib_compiler')

 

三、相关类解析

1、AbstractProcessor

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

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

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

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

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

 

四、代码

1、获取options    

@SupportedAnnotationTypes("com.thor.lib_annotations.ThorAnno")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedOptions("options_value")
public class ThorProcessor extends AbstractProcessor {
    private Messager mMessager;
    
    private String options;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        mMessager = processingEnvironment.getMessager();

        mMessager.printMessage(Diagnostic.Kind.NOTE, ">>>>>>>>>>>>>>>>>>>>>> 初始化");
        options = processingEnvironment.getOptions().get("options_value");
    }

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

javaCompileOptions {
            annotationProcessorOptions {
                arguments = [options_value: “111”]
            }
        }

2、获取被注解的元素

 // 获取所有被 @ARouter 注解的 元素集合
        Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ThorAnno.class);
        
        for (Element element : elements) {
            // 获取类节点,获取包节点 (com.xiangxue.xxxxxx)
            String packageName = elementTool.getPackageOf(element).getQualifiedName().toString();

            // 获取简单类名,例如:MainActivity
            String className = element.getSimpleName().toString();
           
            //获取注解的值
 ThorAnno annotation = element.getAnnotation(ThorAnno.class);
            String value = annotation.value();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值