web-dev-qa-db-ja.com

Kotlinで変数の名前を取得するにはどうすればよいですか?

アプリケーションに多くの属性を持つKotlinクラスがあります。構築したいのは、変数名を辞書に格納するメソッドです。辞書は次のようになります。

_HashMap<String, Pair<Any, Any>>()
_

これの目的は、特定の属性に加えられた変更を保存することです。変数の名前をキーとして保存し、ペアに古い値と新しい値を保存します。変更を通知するには、Observerパターンを使用します。したがって、属性からセッターが呼び出されるたびに、変更が通知され、辞書に保存されます。

以下のコードは次のようになります。

_var person = Person("Harry", 44)
person.age = 45
_

HashMap("age", (44, 45))

現在、変数名を文字列としてハードコーディングしているだけなので、質問は次のとおりです。

Kotlinで変数の名前を動的に取得する方法は?

私はJavaで同じ質問を見ました: Java Reflection:変数の名前を取得する方法は?

また、それが不可能であると主張する同じトピックに関する他のいくつかの質問: 変数のnameプロパティを取得する

単純なコンパイラにはその情報がないため、変数の名前を取得できないことは理解できますが、他の人がこの問題の解決策を持っているかどうかを確認するのは難しいです。

4

デリゲートのプロパティは私の問題の解決策だと思います。

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

3

Kotlinで述べられているように Reflectionに関するドキュメント

_val x = 1

fun main() {
    println(::x.get())
    println(::x.name) 
}
_

式_::x_は、タイプ_KProperty<Int>_のプロパティオブジェクトに評価されます。これにより、get()を使用してその値を読み取ったり、nameプロパティを使用してプロパティ名を取得したりできます。

11
Eric Martori

memberPropertiesを使用して、クラス属性およびその他のプロパティの名前を取得します。例えば:

YourClass::class.memberProperties.map {
 println(it.name)
 println(it.returnType)
}
1