¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?

Cuando tengo una class que tiene un object complementario, ¿es posible establecer una propiedad en este object complementario mediante la reflexión? Puedo hacerlo con properties normales, pero fallar en objects complementarios:

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()) } 

Llamar al colocador por la propiedad normal funciona como debería, pero cuando llamo a companionProp.setter.call(companionProp, "hello") obtengo

Excepción en el hilo "main" java.lang.IllegalArgumentException: object no es una instancia de class declarante

¿Qué tengo que pasar como primer argumento para call() para tener éxito?

Editar: escribí companionProp como primer argumento, pero definitivamente está mal, en realidad lo intenté con el object companion , pero eso tampoco funciona.

object no es una instancia de declarar class

Al igual que en Java, debe pasar el object en sí mismo como primer parámetro al llamar a methods reflexivos.

El primer parámetro para call debe ser el object complementario, ya que ese es el object cuya propiedad está tratando de modificar.

Está pasando el object de class del acompañante en lugar del propio object complementario.

Se puede acceder a un object complementario a través de ClassName.Companion , o cuando se usa una reflexión adicional, a través de KClass#companionObjectInstance .

 companionProp.setter.call(WithProperty.Companion, "hello") companionProp.setter.call(obj::class.companionObjectInstance, "hello") companionProp.setter.call(WithProperty::class.companionObjectInstance, "hello") 

Cuando se ejecutan, ambas variantes imprimen hello world como se esperaba.

Tenga en count que Foo.Companion provocará un error de compilation si el object complementario no existe, mientras que la variante reflectante devolverá null lugar.

el primer argumento es la instancia de la class declarante.

pasa una instancia de KProperty companionProp lugar de una instancia de object complementario. Sin embargo, puede usar KClass.companionObjectInstance para get la instancia de compañía. por ejemplo:

 //a non-static property having a receiver, so it should be a KMutableProperty1 here // v if (companionProp is KMutableProperty1<*, *>) { // get the companion object instance ---v companionProp.setter.call(obj::class.companionObjectInstance, "hello") } 
  • Interoperabilidad de reflexión de Kotlin con Java
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • kotlin reflexión verificación nullable types
  • Llamadas a function de logging usando reflexión en kotlin
  • ¿Cómo get la reference de class de KParameter en kotlin?
  • Cómo acceder a los objects-miembros de una statement de object en kotlin
  • ¿Cómo get un KType en Kotlin?
  • Implementando una interfaz de kotlin en java
  • La igualdad de class Kotlin falla
  • ¿Puedo usar kotlin.reflect para get un valor de un campo
  • Reflexión de KFlin KFunction - get valores de parameters