Kotlin。 如何检查是否可以通过反射字段?

我正在开发一个代码生成器,在运行时从类中获取数据。 该发生器只能与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 }