首先我们要在有用到 annotation processor 的 module 的 build.gradle 里面加上 kapt 的 plugin 宣告。这些 module 包含:
:processor
: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 是 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 。这只是一个简单的应用,後面我们会看到更复杂的用法来帮助我们完成自动化产生程序码。
>>: 那些被忽略但很好用的 Web API / RequestAnimationFrame
本系列文之後也会置於个人网站 昨天,已经完成了一部分配置,且也已经可以建立帐号并登入了。 不过,这...
Golang 切片(Slice) 我看很多中文的教学都是翻切片,我也不知道是不是正确的说法,总之也附...
前言 各位早安,书接上回我们简单介绍了python常见的几种资料型态,接下来几天我们就要来利用Vis...
在铁人赛的第一天,我大概会谈几个我曾经问过我自己的问题,或许可以给一些正在思考着要不要写程序的一些人...
当小菜渣也好一阵子了, 来记录一下 铁人赛结束後,也顺利的录取心目中满意的公司 十一月报到後就开始当...