Как узнать, что переменная lateinit была инициализирована с помощью Reflection? - PullRequest
0 голосов
/ 24 октября 2019

Я хочу через отражение выяснить, было ли инициализировано свойство объекта lateinit. Как мне это сделать?

Получение свойства и проверка ненулевых результатов в UninitializedPropertyAccessException

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

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Начиная с 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, если переменная не инициализирована.

0 голосов
/ 24 октября 2019

Это работает для меня:

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
}
...