如何获取Kotlin构造函数参数的KClass

7
使用 Kotlin 反射,我正在尝试检查类的主构造函数的每个参数的 KClass。
假设有一个如下所示的简单数据类:
data class MyPerson(val name: String, val age: Int)
val modelClass = MyPerson::class

我获取它的主构造函数:val primaryConstructor = modelClass.primaryConstructor。 对于每个参数,我想检查它的类别(是 Kotlin.String、Kotlin.Int 等)。像这样:
for (param in primaryConstructor.parameters) {
  when(param.type) {
    is Kotlin.String -> // do string thing
    is Kotlin.Int -> // do int thing
}

很遗憾,这不是有效的代码。我尝试了param.typeparam.classifierparam.type.jvmErasure和其他一些参数。最接近的是param.type.jvmErasure.qualifiedName,它为我提供了一个包含KClass完全限定名称的字符串。但我真正想要的是KClass。

这有可能吗?

3个回答

10

param.type 表达式返回一个 KType,所以你需要 获取 适当的 KType 实例来进行检查:

for (param in primaryConstructor.parameters) {
    when (param.type) {
        String::class.createType() -> println("String param")
        Int::class.createType() -> println("Int param")
    }
}

提示:在循环中不要每次都创建它们可能是个好主意。
val stringType = String::class.createType()
val intType = Int::class.createType()
for (param in primaryConstructor.parameters) {
    when (param.type) {
        stringType -> println("String param")
        intType -> println("Int param")
    }
}

4
您可以使用 KTypejavaType 属性进行比较:
when (param.type.javaType) {
    String::class.java -> println("String!")
    Int::class.java -> println("Int!")
}

0

使用不安全的类型转换运算符as

val kClass: KClass<*> = param.type.classifier as KClass<*>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接