我正在從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代碼移動,則第二個示例將起作用。這看起來像一個簡單易讀的解決方案。感謝您提供此解決方案! –