【问题标题】:Check type of member/property检查成员/属性的类型
【发布时间】:2018-07-01 04:14:48
【问题描述】:

假设我有任何课程,比如这个:

class SomeClass(val aThing: String, val otherThing: Double)

那我用反射来分析这个类的字段:

for(field in SomeClass.declaredMemberProperties){

}

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

【问题讨论】:

    标签: reflection types kotlin


    【解决方案1】:

    由于 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' 不起作用,也不等于。
    • 你可以使用createType(),而不是createType()
    • @AllanAraújo 您或其他人已经阅读过这可能会遇到数据类中可空属性的有趣用例。由于 KType 参数将返回不可为空的类型,因此您必须这样做: 1. property.type == Any::class.[createType()|startProjectedType].withNullability(true) Ref: nullable KTypeBuild custom method nullable check for ur data class or use javaType
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多