Annotation Processor Setup

Gradle Setup

首先我们要在有用到 annotation processor 的 module 的 build.gradle 里面加上 kapt 的 plugin 宣告。这些 module 包含:

  1. :processor
  2. :processorTest
apply plugin: 'kotlin-kapt'

接着要在 :processor module 里面加入两个 library :Kotlin Poet 和 auto service 。

dependencies {
    implementation 'com.squareup:kotlinpoet:1.6.0'
    implementation "com.google.auto.service:auto-service:1.0-rc6"
}

Kotlin Poet 使用方法

Kotlin Poet 是 Square 出的一个专门产生 kt 档的 library ,我们可以用它扩充性高且泛用的 API 来产生 parser 的程序码,其大多数的 API 都是以 Builder 模式写成的,非常的简单易用。举个简单的例子,假设我们的目标是产生下面的 extension function:

fun Element.getAttributeOrNull(tag: String): String? {
  val attr = getAttribute(tag) ?: return null
  return if (attr.isEmpty() || attr.isBlank()) null else attr
}

它使用到了 DOM parser 里面的 Element ,以 Element 为底去写一个 extension 。这样子在 Kotlin Poet 可以这样写:

const val METHOD_GET_ATTR_OR_NULL = "getAttributeOrNull"
val elementClass = ClassName("org.w3c.dom", "Element")

private fun getAttributeOrNullFunSpec() = FunSpec.builder(METHOD_GET_ATTR_OR_NULL)
        .receiver(elementClass)
        .addParameter("tag", String::class)
        .addCode(
            """
            |val attr = getAttribute(tag) ?: return null
            |return if (attr.isEmpty() || attr.isBlank()) null else attr
            """.trimMargin()
        )
        .returns(String::class.asTypeName().copy(nullable = true))
        .build()

elementClass 里面是指定在 org.w3c.dom.Element 的类别 ,这个类别不用特别宣告 import ,Kotlin Poet 在产生程序码的时候会自动帮我们 import org.w3c.dom.Element 。接着,我们用 FunSpec 来组合我们的 extension function , receiver 是要以什麽为底去当 extension ,这边用的是 Element ,也可以透过 addParameter API 去加入参数,只要记得指定名字和型别就可以了!比较重要的地方是 addCode 这边,可以把整段程序码写进去 function 里面。最後,指定 return 的型别和 呼叫 build() 就完成这个 extension 的 generator 。这只是一个简单的应用,後面我们会看到更复杂的用法来帮助我们完成自动化产生程序码。


<<:  VM 执行个体 (一)

>>:  那些被忽略但很好用的 Web API / RequestAnimationFrame

Day02 - 【入门篇】Quick Start(2)

本系列文之後也会置於个人网站 昨天,已经完成了一部分配置,且也已经可以建立帐号并登入了。 不过,这...

Golang 切片slice与Map

Golang 切片(Slice) 我看很多中文的教学都是翻切片,我也不知道是不是正确的说法,总之也附...

爬虫怎麽爬 从零开始的爬虫自学 DAY6 python怎麽玩数字

前言 各位早安,书接上回我们简单介绍了python常见的几种资料型态,接下来几天我们就要来利用Vis...

#Day1--开始之前

在铁人赛的第一天,我大概会谈几个我曾经问过我自己的问题,或许可以给一些正在思考着要不要写程序的一些人...

菜鸟新人第七十五天

当小菜渣也好一阵子了, 来记录一下 铁人赛结束後,也顺利的录取心目中满意的公司 十一月报到後就开始当...