Java에서 Kotlin으로 클래스를 이식하고 있습니다. 이 클래스는 수백 개의 객체를 선언합니다. 각 객체에는 객체의 선언 된 변수 이름과 동일한 name 속성이 있습니다. Java reflection을 사용하면 리플렉션을 통해 선언 된 이름을 사용하여 객체 멤버 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
}
???
라인은 내가 member.name
에로 설정하는 MyTestObject
의 name
재산에 접근하고 싶은 곳이다 : 다음은 몇 가지 간단한 테스트 코드입니다. (member.toObject() as MyTestObject).name = member.name
과 비슷한 기능을 찾고 있습니다.
첫 번째 예가 효과가 있습니다. 두 번째 동일한 클래스 MyTestObject 시도했지만 get() 항상 null을 제공합니다. 이 접근법에 익숙하지 않아 소프트웨어를 지나치게 복잡하고 읽을 수 없게 만드는 경향이 있으므로 위임 예제를 시도하지 않았습니다. –
두 번째 예제는 속성 선언 다음에 동반자 개체의 코드를 초기화 코드로 옮기면 작동합니다. 이것은 간단하고 읽기 쉬운 솔루션처럼 보입니다. 이 솔루션을 제공해 주셔서 감사합니다! –