使用 Kotlin 反射,我试图检查类的主构造函数的每个参数的 KClass。
给定一个像这样的简单数据类:
data class MyPerson(val name: String, val age: Int)
val modelClass = MyPerson::class
Run Code Online (Sandbox Code Playgroud)
我得到它的主要构造函数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
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不是有效的代码。我试过param.type,param.classifier,param.type.jvmErasure和其他人。我发现的最接近的是param.type.jvmErasure.qualifiedName,它给了我一个带有 KClass 完全限定名称的字符串。但我真的很想要 KClass。
这可能吗?
该param.type表达式返回 a KType,因此您需要获取适当的Ktype实例以进行检查:
for (param in primaryConstructor.parameters) {
when (param.type) {
String::class.createType() -> println("String param")
Int::class.createType() -> println("Int param")
}
}
Run Code Online (Sandbox Code Playgroud)
旁注:最好不要在循环中每次都创建这些:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用javaType的属性KType进行比较:
when (param.type.javaType) {
String::class.java -> println("String!")
Int::class.java -> println("Int!")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2163 次 |
| 最近记录: |