kotlin-reflect¶
为了从任何 KType
生成源代码,包括内置反射 API 无法访问的信息,KotlinPoet 依赖于 kotlin-reflect。kotlin-reflect
可以读取类的元数据并访问这些额外信息。例如,KotlinPoet 可以从泛型 KType
读取类型参数及其方差,并生成相应的源代码。
尽管 kotlin-reflect
是一个相对较大的依赖项,但在某些情况下,希望将其从最终可执行文件中移除以节省空间和/或简化 proguard/R8 设置(例如,对于生成 Kotlin 代码的 Gradle 插件)。这样做是可能的,并且仍然可以使用大多数 KotlinPoet API。
dependencies {
implementation("com.squareup:kotlinpoet:<version>") {
exclude(module = "kotlin-reflect")
}
}
需要 kotlin-reflect
的主要 API 是 KType.asTypeName()
和 typeNameOf<T>()
。如果您在类路径中没有 kotlin-reflect
的情况下调用其中之一,并且类型是泛型或带有注解,将会导致崩溃。
您可以用显式传递类型参数或注解、且不需要 kotlin-reflect
的代码来替换它。例如
// Replace
// kotlin-reflect needed
val typeName = typeNameOf<List<Int?>>()
// With
// kotlin-reflect not needed
val typeName =
List::class.asClassName().parameterizedBy(Int::class.asClassName().copy(nullable = true))