自定义AnnotationProcessor (二)

前言:本demo推荐使用过retrofit 后再阅读

问题

  1. 如果项目中 需要使用多台服务器的接口,那么retrofit 设置的baseurl 肯定是不同的,这个时候需要每个baseurl 都创建一个retrofit对象(当然,你也可以每个接口都使用@URL来设置全路径)
  2. 在使用retrofit 的时候如果需要某一个接口设置特殊的timeout时间,那么一般的做法是新建一个okhttpclient,然后设置timeout时间。之后再新建一个retrofit 设置url。

需求:通过注解,在运行时生成 构建retrofit的类


Demo将会用到的库有

  • retrofit
  • okhttp
  • rxjava2
  • retrofit2-rxjava2-adapter
  • gson

接下来我们来改造之前搭建好的项目

  1. 为了项目结构的清晰,咱们把注解单独放到一个项目中,新建java-librarymodule:rheahttp

  2. 记得添加kotlin 插件编译

  3. 既然是处理注解的,那么我们首先要自定义注解

    kotlin 中使用 annotation class 来定义一个注解

    1
    2
    3
    @Retention(AnnotationRetention.SOURCE)
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)
    annotation class RheaHttp(val name: String = "RetrofitFactory")
    • 这个注解是描述Class相关信息的
    1
    2
    3
    @Retention(AnnotationRetention.SOURCE)
    @Target(AnnotationTarget.FUNCTION)
    annotation class RheaClient(val url:String)
    • 这个是描述Function的
  4. compiler gradle 添加依赖,引入注解

    1
    implementation project(':rheahttp')
  5. RheaProcessor 类增加 SupportedAnnotationTypes 注解

    SupportedAnnotationTypes用来指示注释处理器支持哪些注释类型的注释

    1
    @SupportedAnnotationTypes("cn.xabad.rhea.rheahttp.RheaHttp")
  6. RheaProcessor 申明 filer 变量 (filer是干什么的?)

    1
    private lateinit var filer: Filer
  7. 重写 init函数,给filer赋值

    1
    2
    3
    4
    @Synchronized override fun init(processingEnv: ProcessingEnvironment) {
    super.init(processingEnv)
    filer = processingEnv.filer
    }
  8. RheaProcessor process方法增加实现

    根据注解类找到相关信息

    1
    2
    3
    4
    val set = roundEnv.getElementsAnnotatedWith(RheaHttp::class.java)
    set.forEach {
    println("###:"+it)
    }
  9. 回到我们的app gradle 增加注解依赖

    1
    implementation project(':rheahttp')
  10. 在 app 中新建类 RestApi 然后使用我们的注解

    1
    2
    3
    @RheaHttp
    class RestApi {
    }
  11. 编译 app ,会看到我们想要打印的日志

    1
    ###:cn.xabad.rheahttp.sample.RestApi

本篇文章结束!