如何找到 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。
我想通过反射找出对象的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。