如何找到 lateinit var 是否已通过反射初始化?

How to find is a lateinit var has been initialized via Reflection?

我想通过反射找出对象的lateinit 属性 是否已经初始化。我该怎么做?

获取 属性 并在 UninitializedPropertyAccessException

中检查非空结果
fun Any.isAnyEntityInitialized () {
    val clazz = this.javaClass.kotlin
    val filteredEntities = clazz.declaredMemberProperties.filter {
        it.isLateinit && getDelegate(this) != null
    }
}

这对我有用:

import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.jvm.javaField

class Test {
    lateinit var s: String
}

fun Any.isAnyEntityInitialized(): Boolean =
    this::class.declaredMemberProperties.any { property ->
        property.isLateinit && property.javaField?.get(this) != null
    }

fun main() {
    val test = Test()
    println(test.isAnyEntityInitialized()) // prints false
    test.s = "test"
    println(test.isAnyEntityInitialized()) // prints true
}

从 Kotlin 1.2 开始,已经有一个函数。

您可以使用函数:isInitialized docs

代码示例:

lateinit var key: String

fun useKey() {
    check(::key.isInitialized) { "The field 'key' must be initialized" }
    // use key safely
}

注意: check如果变量没有初始化会抛出IllegalStateException。