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

时间:2016-10-27 06:49:58

标签: java reflection null kotlin nullable

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

所以主要问题是如何通过反射实现这项检查?

1 个答案:

答案 0 :(得分:11)

您可以使用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

摘自documentation(强调我的):

  

对于Kotlin类型,它意味着允许空值   由这种类型代表。在实践中,它意味着类型是   最后用问号声明。对于非Kotlin类型,它   表示使用此类型声明的类型或符号   使用运行时保留的可空性注释进行注释,例如   javax.annotation.Nullable。

     

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

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