科特林。 如何检查是否可以通过reflection字段?

我正在开发一个代码生成器,在运行时从类中获取数据。 该发生器只能与Kotlin一起使用。 目前,我正面临着这个问题,因为我不知道如何检查该字段是否可以空。

所以主要问题是如何通过reflection来实现这个检查?

你可以用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 

从文档摘录(重点是我的):

对于Kotlintypes来说,这意味着可以用这个types来表示空值。 实际上,这意味着types在最后被标记为问号。 对于非Kotlintypes,这意味着使用此types声明的types或符号使用运行时保留的可空性注释(例如javax.annotation.Nullable)进行注释。

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

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