コンパニオンオブジェクトを持つクラスがある場合、リフレクションを使用してこのコンパニオンオブジェクトにプロパティを設定できますか?私は通常のプロパティでそれを行うが、コンパニオンオブジェクトに失敗することがあります。通常プロパティのセッターを呼び出す反射を介してKotlinのコンパニオンオブジェクトのプロパティを設定するにはどうすればよいですか?
がimport kotlin.reflect.KMutableProperty
import kotlin.reflect.full.companionObject
import kotlin.reflect.full.memberProperties
class WithProperty {
lateinit var prop: String
companion object {
lateinit var companionProp: String
}
fun test() = "$companionProp $prop"
}
fun main(args: Array<String>) {
val obj = WithProperty()
val prop = obj::class.memberProperties.filter { it.name == "prop" }.first()
if (prop is KMutableProperty<*>) {
prop.setter.call(obj, "world")
}
val companion = obj::class.companionObject
if (companion != null) {
val companionProp = companion.memberProperties.filter { it.name == "companionProp" }.first()
if (companionProp is KMutableProperty<*>) {
companionProp.setter.call(companionProp, "hello") // <-- what must go here as first argument?
}
}
println(obj.test())
}
それが必要として動作しますが、私はcompanionProp.setter.call(companionProp, "hello")
を呼び出すときに、私は
例外での取得しますスレッドmain "java.lang.IllegalArgumentException:オブジェクトが宣言クラスのインスタンスでない場合
成功するには、最初の引数として何を渡す必要がありますか?
編集:私は最初の引数としてcompanionProp
を書いたが、それは間違いなく間違っている、私は実際にcompanion
オブジェクトと試みたが、それは同様に機能していません。
実際のコードが実際のコードと同じように 'obj :: class.companionObjectInstance'で表示されますが、実際のクラスは何か分かりません。 –