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

时间:2018-03-28 18:55:48

标签: reflection kotlin

使用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。

这有可能吗?

2 个答案:

答案 0 :(得分:4)

param.type表达式返回KType,因此您需要get相应的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")
    }
}

答案 1 :(得分:3)

您可以使用KType的{​​{3}}属性进行比较:

when (param.type.javaType) {
    String::class.java -> println("String!")
    Int::class.java -> println("Int!")
}