0

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

在 UninitializedPropertyAccessException 中获取属性并检查非空结果

fun Any.isAnyEntityInitialized () {
    val clazz = this.javaClass.kotlin
    val filteredEntities = clazz.declaredMemberProperties.filter {
        it.isLateinit && getDelegate(this) != null
    }
}
4

2 回答 2

1

这对我有用:

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
}
于 2019-10-24T18:47:29.280 回答
1

从 Kotlin 1.2 开始,已经有了一个功能。

您可以使用该功能:isInitialized 文档

代码示例:

lateinit var key: String

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

注意: check如果变量未初始化,将抛出 IllegalStateException。

于 2019-10-24T22:37:58.427 回答