【发布时间】:2018-07-01 04:14:48
【问题描述】:
假设我有任何课程,比如这个:
class SomeClass(val aThing: String, val otherThing: Double)
那我用反射来分析这个类的字段:
for(field in SomeClass.declaredMemberProperties){
}
如何查看每个字段的类型?
【问题讨论】:
标签: reflection types kotlin
假设我有任何课程,比如这个:
class SomeClass(val aThing: String, val otherThing: Double)
那我用反射来分析这个类的字段:
for(field in SomeClass.declaredMemberProperties){
}
如何查看每个字段的类型?
【问题讨论】:
标签: reflection types kotlin
由于 Kotlin 没有字段,只有带有支持字段的属性,因此您应该检查属性的返回类型。
试试这个:
class SomeClass(val aThing: String, val otherThing: Double)
for(property in SomeClass::class.declaredMemberProperties) {
println("${property.name} ${property.returnType}")
}
更新:
如果类不使用没有支持字段的自定义 getter 和/或 setter,您可以像这样获取支持字段的类型:
property.javaField?.type
作为一个完整的示例,这是您的类,其中包含一个名为 foo 的附加 val 属性和一个自定义 getter(因此没有创建支持字段)。您将看到该属性的 getJavaField() 将返回 null。
class SomeClass(val aThing: String, val otherThing: Double) {
val foo : String
get() = "foo"
}
for(property in SomeClass::class.declaredMemberProperties) {
println("${property.name} ${property.returnType} ${property.javaField?.type}")
}
更新 2:
使用String::class.createType() 将返回每个 KClass 的 KType,因此您可以使用例如property.returnType == String::class.createType() 找出它是否是(kotlin)字符串。
【讨论】:
createType(),而不是createType()。
property.type == Any::class.[createType()|startProjectedType].withNullability(true) Ref: nullable KType 或 Build custom method nullable check for ur data class or use javaType