我正在开发一个代码生成器,它在运行时从类中获取数据。这个生成器被设计为只能与Kotlin一起工作。目前,我面临着这个问题,因为我不知道如何检查字段是否可空。
所以主要的问题是如何通过反射来实现这个检查?
您可以使用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类型,这意味着允许为空值用这种类型表示的。在实践中,它意味着类型是在结尾用问号声明。对于非kotlin类型,它表示用此类型声明的类型或符号为使用运行时保留的空性注释进行注释,例如javax.annotation.Nullable .
请注意,即使
isMarkedNullable
为false,该类型的值也可以仍然是null
。如果它是类型参数的类型,则可能发生这种情况具有可为空的上界:fun <T> foo(t: T) { // isMarkedNullable == false for t's type, but t can be null here }