Reflection 检查成员/属性的类型

Reflection 检查成员/属性的类型,reflection,types,kotlin,Reflection,Types,Kotlin,假设我有任何一门课,像这样: class SomeClass(val aThing: String, val otherThing: Double) 然后我使用反射来分析这个类的字段: for(field in SomeClass.declaredMemberProperties){ } 如何检查每个字段的类型?由于Kotlin没有字段,只有带有支持字段的属性,因此您应该检查属性的返回类型 试试这个: class SomeClass(val aThing: String, val

假设我有任何一门课,像这样:

class SomeClass(val aThing: String, val otherThing: Double)
然后我使用反射来分析这个类的字段:

for(field in SomeClass.declaredMemberProperties){

}

如何检查每个字段的类型?

由于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)字符串。

这是一个进步。property.returnType返回一个KType。例如,如果我想再次检查一个字符串,如果该KType是字符串,或者获取字符串KType,我该如何检查is'不起作用,等于两者都不起作用。您可以使用
property.returnType.classifier作为,而不是使用
createType()
?KClass
@AllanAraújo您或其他人读过这篇文章,可能会遇到数据类中可为空属性的有趣用例。由于KType参数将返回NOTNULLABLE type,因此必须执行以下操作:1
property.type==Any::class。[createType()| startProjectedType]。具有Nullability(true)
Ref:,或