【问题标题】:How to get the KClass for a Kotlin constructor parameter如何获取 Kotlin 构造函数参数的 KClass
【发布时间】:2018-03-28 18:55:48
【问题描述】:

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

这可能吗?

【问题讨论】:

    标签: reflection kotlin


    【解决方案1】:

    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】:

      您可以使用KTypejavaType 属性进行比较:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多