Получение имени свойства элемента stati c в Kotlin - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть такой javaclass внутри Kotlin проекта:

public final class BuildConfig {
  public static final String FOO = "HelloWorld";
  public static final String ALT_FOO = "HelloWorldAlt";
}

Как я могу получить строку со значением FOO? (не значение поля, имя поля)

т.е. val theName = "FOO"

Например, позже у меня будет карта.

val map = mapOf("FOO" to "HelloWorldAlt", "BAR" to "CoronaGotMeInside")

и я хочу сделать следующее:

val result = map[theName]
println(result)
// HelloWorldAlt

Я знаю, что могу получить все значения полей, как показано ниже, но я не могу понять, как получить данные c имя переменной-члена от одного состояния c вар. Я не хочу повторять все staticProperties. Я хочу явно посмотреть один.

val notResult = BuildConfig::class.staticProperties.filter { it.name == "FOO" }[0].getter.call()
println(notResult)
// HelloWorld

В качестве примера не итеративного решения я хочу что-то вроде этого:

val theName = BuildConfig.FOO::variableName() // Totally made up, but I want to act on the singular constant, not on a collection 

Это позволило бы мне иметь некоторую уверенность во время компиляции при использовании переменных с именем карты ключ. Сумасшедший я знаю.

1 Ответ

0 голосов
/ 26 апреля 2020

Благодаря Tenfour04

BuildConfig::FOO.name

:: является частью метапрограммирования: https://towardsdatascience.com/kotlin-the-next-frontier-in-modern-meta-programming-8c0ac2babfaa

В сочетании с .name is Reflection:

Выражение :: x оценивается как объект свойства типа KProperty, что позволяет нам читать его значение с помощью get () или извлекать имя свойства с помощью свойства name.

https://kotlinlang.org/docs/reference/reflection.html

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-mutable-property/

Зачем получать класс в Kotlin с использованием двойного двоеточия (::)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...