一、概念

就是java代码在编译时,就解析相关的注解。所以其对运行时效率极高,因为注解在编译时就解析完毕了。

相关资料:

https://blog.csdn.net/fengxingzhe001/article/details/78520298

https://blog.csdn.net/hongxue8888/article/details/97228827

https://www.jianshu.com/p/7e201f3fbb84

https://www.sohu.com/a/190297582_611601

https://blog.csdn.net/xiayong1/article/details/85854725

https://xujiajia.blog.csdn.net/article/details/105027291

https://my.oschina.net/u/1177694/blog/3018281

https://blog.csdn.net/qq_20521573/article/details/82321755

二、集成步骤

1.新建java-library

注意工程一定是java工程,不是android工程。否则无法导入AbstractProcessor这个类。

且java-library无法引用android-library及以及某些android库,这个一定要注意。

2.引用库

dependencies {
    //autoservice用来自动生成META-INFO文件,注册注解解析器。
    implementation 'com.google.auto.service:auto-service:1.0-rc6'
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
    // 帮助我们通过类调用的方式来生成java代码
    implementation 'com.squareup:javapoet:1.11.1'
}

三、新建自定义注解解析器类

1.新建类并继承AbstractProcessor

2.为自定义类加上@AutoService(Processor.class)

@AutoService(Processor.class)
public class LyRouteProcessor extends AbstractProcessor {
    ...
}

AutoService是google开发一个注解,作用是为注解解析器类自动生成jar包里的配置文件。

3.复写AbstractProcessor的几个配置方法

下面的几个方法都有相对应的注解类,直接在自定义类上注解。采用方法复写,更便于继承。

1)getSupportedOptions

 @Override
    public Set getSupportedOptions() {
        return ImmutableSet.of(ProcessorConfig.OPTION_MODULE_NAME,
                ProcessorConfig.OPTION_MODULE_DEBUG
                );
    }

用于接收gradle的配置参数,参数的类型都只能是String类型。

对应gradle的配置参数如下:

android {
    ...
    defaultConfig {
        ...
        //将module的名称传递给路由框架
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                        moduleName: project.getName(),
                        debug : "t"
                ]
            }
        }
    }
    ...
}

2)getSupportedSourceVersion

@Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

3)getSupportedAnnotationTypes

@Override
    public Set getSupportedAnnotationTypes() {
        return ImmutableSet.of(LyRoute.class.getName());
    }

指定自定义注解解析器所支持的注解类型,只有这里返回的注解类型才可被扫描到。

4.复写AbstractProcessor的init方法

可以在此处获得一些工具类如Filer、Messager,获取gradle的option参数。

5.复写AbstractProcessor的process方法

这个是自定义注解解析器的核心方法,也是业务实现的地方。

1)通过下面的方法,获取注解元素的集合。

Set elements = roundEnvironment.getElementsAnnotatedWith(LyRoute.class);

2)遍历注解元素集合,通过poet技术生成模板文件。

对于简单的类生成可以不采用poet,直接使用字符串替换,具体可参考Tinker源码中关于DefaultLifeCycle注解的处理。

四、常用操作

1.判断类型

先获取待判断的两个类型的TypeMirror,再通过Types类的isSubtype方法判断两个TypeMirror的子属关系。

通过全类名获取TypeMirror的方法

Elements.getTypeElement(全类名);

五、调试

https://blog.csdn.net/zhangteng22/article/details/54946270

1.在gradle.properties中加入以下参数

org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8013

2. 在Android Studio建立Remote Debugger。

3.终端输入 gradlew --daemon

4.打好断点,执行 Remote Debugger。

5.执行 gradlew clean assembleDebug 或者rebuild

分类: 注解

0 条评论

发表回复

您的电子邮箱地址不会被公开。