科特林。如何通过反射检查字段是否为空?

2022-09-03 14:34:53

我正在开发一个代码生成器,它在运行时从类中获取数据。此生成器设计为仅与 Kotlin 配合使用。目前,我遇到了这个问题,因为我不知道如何检查该字段是否为空。

因此,主要问题是如何通过反射实现此检查?


答案 1

您可以使用 isMarkedNullable 检查可空性。下面的代码:

class MyClass(val nullable: Long?, val notNullable: MyClass)
MyClass::class.declaredMemberProperties.forEach {
    println("Property $it isMarkedNullable=${it.returnType.isMarkedNullable}")
}

将打印:

Property val MyClass.notNullable: stack.MyClass isMarkedNullable=false
Property val MyClass.nullable: kotlin.Long? isMarkedNullable=true

摘自文档(强调我的):

对于 Kotlin 类型,这意味着允许此类型表示 null 值。在实践中,这意味着该类型是在末尾用问号声明的。对于非 Kotlin 类型,这意味着使用此类型声明的类型或符号将使用运行时保留的可空性注释(如 javax.annotation.Nullable)进行注释。

请注意,即使 isMarkedNullable 为 false,该类型的值仍可以为 null。如果它是具有可空上限的类型参数的类型类型,则可能会发生这种情况:

fun <T> foo(t: T) {
    // isMarkedNullable == false for t's type, but t can be null here 
}

答案 2