使用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。
这有可能吗?
答案 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!")
}