检查成员/属性的类型

All*_*újo 4 reflection types kotlin

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

class SomeClass(val aThing: String, val otherThing: Double)
Run Code Online (Sandbox Code Playgroud)

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

for(field in SomeClass.declaredMemberProperties){

}
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ech 6

由于Kotlin没有字段,只有具有支持字段的属性,因此应检查属性的返回类型.

试试这个:

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

    for(property in SomeClass::class.declaredMemberProperties) {
        println("${property.name} ${property.returnType}")
    }
Run Code Online (Sandbox Code Playgroud)

更新:

如果该类不使用自定义getter和/或没有支持字段的setter,则可以获得支持字段的类型,如下所示:

property.javaField?.type
Run Code Online (Sandbox Code Playgroud)

作为一个完整的例子,这里是你的类,带有一个额外的val属性,名为foo,带有自定义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}")
    }
Run Code Online (Sandbox Code Playgroud)

UPDATE2:

使用String::class.createType()将为每个KClass返回KType,因此您可以使用eg property.returnType == String::class.createType()来查明它是否是(kotlin)字符串.

  • 您可以使用 `property.returnType.classifier as?,而不是使用 `createType()`。KClass`。 (2认同)