如何在 Kotlin 中获取变量的名称?
How to get the name of a variable in Kotlin?
我的应用程序中有一个 Kotlin class,它有很多属性,我想构建的是一个将变量名存储在字典中的方法。字典看起来像这样:
HashMap<String, Pair<Any, Any>>()
这样做的目的是存储对某个属性所做的更改,我将变量的名称存储为键,在 Pair 中我存储旧值和新值。为了通知更改,我使用观察者模式。因此,每当从属性调用 setter 时,都会通知更改并将其存储到字典中。
下面的代码产生以下结果:
var person = Person("Harry", 44)
person.age = 45
HashMap("age", (44, 45))
现在我只是将变量名称硬编码为字符串,所以我的问题是:
Kotlin中如何动态获取变量名?
我在Java看到了同样的问题:Java Reflection: How to get the name of a variable?
还有一些关于同一主题的其他问题声称不可能:Get the name property of a variable
我能理解无法获取变量名,因为简单的编译器没有该信息,但我仍然很好奇其他人是否有解决此问题的方法。
我认为委托属性是我的问题的解决方案:
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 documentation about Reflection 中所述:
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
表达式 ::x
的计算结果为 KProperty<Int>
类型的 属性 对象,这允许我们使用 get()
读取其值或检索 属性名称使用 name
属性.
使用memberProperties
获取class 属性和其他属性的名称。例如:
YourClass::class.memberProperties.map {
println(it.name)
println(it.returnType)
}
我的应用程序中有一个 Kotlin class,它有很多属性,我想构建的是一个将变量名存储在字典中的方法。字典看起来像这样:
HashMap<String, Pair<Any, Any>>()
这样做的目的是存储对某个属性所做的更改,我将变量的名称存储为键,在 Pair 中我存储旧值和新值。为了通知更改,我使用观察者模式。因此,每当从属性调用 setter 时,都会通知更改并将其存储到字典中。
下面的代码产生以下结果:
var person = Person("Harry", 44)
person.age = 45
HashMap("age", (44, 45))
现在我只是将变量名称硬编码为字符串,所以我的问题是:
Kotlin中如何动态获取变量名?
我在Java看到了同样的问题:Java Reflection: How to get the name of a variable?
还有一些关于同一主题的其他问题声称不可能:Get the name property of a variable
我能理解无法获取变量名,因为简单的编译器没有该信息,但我仍然很好奇其他人是否有解决此问题的方法。
我认为委托属性是我的问题的解决方案:
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 documentation about Reflection 中所述:
val x = 1
fun main() {
println(::x.get())
println(::x.name)
}
表达式 ::x
的计算结果为 KProperty<Int>
类型的 属性 对象,这允许我们使用 get()
读取其值或检索 属性名称使用 name
属性.
使用memberProperties
获取class 属性和其他属性的名称。例如:
YourClass::class.memberProperties.map {
println(it.name)
println(it.returnType)
}