KotlinPoet-metadata¶
interop:kotlin-metadata 是一个用于处理 Kotlin @Metadata 注解的 API。它的 API 基于 kotlin-metadata,为其类型和 JVM 元数据信息提供扩展。这可用于从 Class 或 TypeElement 的 @Metadata 注解中读取 Kotlin 语言语义。
示例¶
data class Taco(val seasoning: String, val soft: Boolean) {
fun prepare() {
}
}
val kmClass = Taco::class.toKmClass()
// Now you can access misc information about Taco from a Kotlin lens
println(kmClass.name)
kmClass.properties.forEach { println(it.name) }
kmClass.functions.forEach { println(it.name) }
标志¶
在 Flags.kt 下,类型也有一些布尔标志可用。这些标志读取底层的 kotlin-metadata Flags 属性。
使用上面的 Taco 示例,我们可以获取某些信息
println("Is class? ${kmClass.isClass}")
println("Is data class? ${kmClass.isData}")
与 KotlinPoet 的互操作性¶
interop:kotlin-metadata 提供了一个 API,用于将核心 kotlin-metadata Km 类型转换为其 API 的 KotlinPoet 源代码表示。这包括完整的类型解析、签名、包含的元素以及底层 API 的通用存根源代码表示。
示例¶
data class Taco(val seasoning: String, val soft: Boolean) {
fun prepare() {
}
}
val typeSpec = Taco::class.toTypeSpec()
// Or FileSpec
val fileSpec = Taco::class.toFileSpec()
源代码表示¶
生成的表示是底层源代码的尽力而为的表示。这意味着合成元素将被排除在生成之外。像 lambda 或委托这样的 Kotlin 特定语言特性将被强制转换为它们的习惯源代码形式。
为了提供帮助,toTypeSpec() 和 toFileSpec() 接受可选的 ClassInspector 实例,以协助解析/理解底层 JVM 代码。这对于注解、伴生对象、某些 JVM 修饰符、覆盖等很重要。虽然它是可选的,但如果没有这些信息,表示的源代码可能不完整。反射式和 javax Elements 的实现可在 com.squareup.kotlinpoet.metadata.classinspectors 包下找到。
生成的源代码仅是存根实现,这意味着函数、属性 getter 和委托属性等元素的实现细节仅通过 TODO() 占位符进行存根。
已知限制¶
- 目前仅支持
KotlinClassMetadata.Class和KotlinClassMetadata.FileFacade。不支持SyntheticClass、MultiFileClassFacade或MultiFileClassPart @JvmOverloads注解仅支持ElementsClassInspector,不支持反射。- 非 const 字面值仅支持
ElementsClassInspector,不支持反射。 - 来自
synthetic构造的 ClassInspector 数据仅支持ReflectiveClassInspector,不支持 elements。这是因为 javax Elements API 不建模 synthetic 构造。这可能导致一些信息缺失,例如静态伴生对象属性或property:目标注解。 - 使用
AnnotationRetention.SOURCE注解的注解在反射和 javax elements 中都不可解析。