跳到内容

kotlin-reflect

为了从任何 KType 生成源代码,包括内置反射 API 无法访问的信息,KotlinPoet 依赖于 kotlin-reflectkotlin-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))