Как получить имя переменной в Kotlin?
У меня в приложении есть класс Kotlin с большим количеством атрибутов, и я хочу построить метод, который сохраняет имя переменной в словаре. Словарь выглядит так:
HashMap<String, Pair<Any, Any>>()
Целью этого является сохранение изменений, внесенных в определенный атрибут, я сохраняю имя переменной в качестве ключа, а в паре я сохраняю старое значение и новое значение. Для уведомления об изменениях я использую шаблон Observer. Таким образом, всякий раз, когда сеттер вызывается из атрибута, об изменении будет сообщено и сохранено в словаре.
Код ниже приводит к следующему:
var person = Person("Harry", 44)
person.age = 45
HashMap("age", (44, 45))
Сейчас я просто жестко прописываю имя переменной в виде строки, поэтому мой вопрос:
Как динамически получить имя переменной в Kotlin?
Я видел тот же вопрос в Java: Отражение Java: Как получить имя переменной?
Также некоторые другие вопросы по той же теме, утверждающие, что это невозможно: Получить свойство name переменной
Я могу понять, что невозможно получить имя переменной, потому что у простого компилятора такой информации нет, но я все еще стараюсь понять, есть ли у других решение этой проблемы.
2 ответа
Я думаю, что свойства делегатов являются решением моей проблемы:
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to '${property.name}' in $thisRef.")
}
}
Кредиты поступают по адресу: Roland Источник: https://kotlinlang.org/docs/reference/delegated-properties.html
Как указано в документации Kotlin о Reflection:
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
Выражение ::x
оценивает свойство объекта типа KProperty<Int>
, что позволяет нам читать его значение с помощью get()
или получить имя свойства, используя name
имущество.
Использовать memberProperties
чтобы получить имена атрибутов класса и других свойств. Например:
YourClass::class.memberProperties.map {
println(it.name)
println(it.returnType)
}