我正在开发一个代码生成器,它在运行时从类中获取数据。该发生器仅适用于Kotlin。目前,我遇到了问题,因为我不知道如何检查该字段是否可以为空。
所以主要问题是如何通过反射实现这项检查?
答案 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 }