代码之家  ›  专栏  ›  技术社区  ›  ljd

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

  •  7
  • ljd  · 技术社区  · 8 年前

    使用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.type ,则, param.classifier ,则, param.type.jvmErasure 和其他人。我找到的最接近的是 param.type.jvmErasure.qualifiedName ,它为我提供了一个包含KClass的完全限定名称的字符串。但我真的很想要KClass。

    这有可能吗?

    2 回复  |  直到 8 年前
        1
  •  10
  •   zsmb13    8 年前

    这个 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")
        }
    }
    
        2
  •  4
  •   s1m0nw1    8 年前

    您可以使用 javaType 的属性 KType 为了进行比较:

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