Как я могу получить контейнер KmutableProperty i Kotlin? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть val prop:KMutableProperty1<<A,Any>> поля x в классе A, я могу получить имя поля по prop.name, но как мне получить его имя класса контейнера (A)?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Доступ к объявленному классу сложен, поскольку свойства могут иметь разные детали реализации в зависимости от того, как они определены. Используя как потенциальное вспомогательное поле, так и общедоступный метод получения, мы можем создать довольно надежный способ доступа к объявленному классу:

fun KProperty<*>.declaringClass(): Class<*> {
    return (this.javaField as Member? ?: this.javaGetter)?.declaringClass
             ?: error("Unable to access declaring class")
}

Если элемент является резервным свойством, поле будет определять класс, в котором он объявлен. В противном случае он будет принимать класс, объявляющий метод получения.

0 голосов
/ 29 июня 2018

Я думаю, это будет зависеть от того, как вы получите ссылку на это свойство, но если вы сделаете это так:

class A(var x: Int = 0)

val prop: KMutableProperty1<A, Any> = A::x as KMutableProperty1<A, Any>

Тогда эта цепочка попыток приведения может дать вам экземпляр KClass:

val kclass = (prop as? MutablePropertyReference1)?.owner as? KClass<*>
println(kclass) // class A

Опять же, это не будет работать почти во всех случаях, поскольку являются другими реализациями интерфейсов, которые эти свойства фактически возвращают, поэтому приведение может завершиться неудачей.

...