我正在从Java移植到Kotlin的一个类。这个类声明了数百个对象。每个对象都有一个名称属性,它与对象的声明变量名称相同。 Java反射允许通过反射使用声明的名称来设置对象成员name
。只需在数百个构造函数中保存一个参数即可。如何使用Kotlin反射更改成员字段?
我尝试在Kotlin中做同样的事情,但无法弄清楚如何做属性设置。下面是一些简单的测试代码:
package myPackage
import kotlin.reflect.full.companionObject
import kotlin.reflect.full.declaredMemberProperties
class MyTestObject() {
var name: String = "NotInitialized"
companion object {
val Anton = MyTestObject()
val Berta = MyTestObject()
val Caesar = MyTestObject()
}
}
fun main(args : Array<String>) {
println(MyTestObject.Anton.name) // name not yet initialized
// Initialize 'name' with the variable name of the object:
for (member in MyTestObject::class.companionObject!!.declaredMemberProperties) {
if (member.returnType.toString() == "myPackage.MyTestObject") {
println("$member: ${member.name}")
// Set 'name' property to 'member.name':
// ???
}
}
println(MyTestObject.Anton.name) // now with the initialized name
}
的???
线是我想获得访问的MyTestObject
的name
属性将其设置为以member.name
。我正在寻找类似于(member.toObject() as MyTestObject).name = member.name
的功能。
你的第一个例子工作。我在同一个类MyTestObject中尝试了第二个,但get()总是提供null。还没有尝试委托的例子,因为我不熟悉这种方法,它往往会使软件过于复杂和不可读。 –
如果我在属性声明之后将伴随对象内的代码作为init代码移动,则第二个示例将起作用。这看起来像一个简单易读的解决方案。感谢您提供此解决方案! –