El operador de Kotlin Reflection obtiene la implementación

Estoy aprendiendo Kotlin, actual usando Fedora 25 OpenJDK 8 y Kotlin 1.1.

Copié el ejemplo del website de Kotlin: https://kotlinlang.org/docs/reference/delegated-properties.html y cambié el operador get.

class Example { var p: String by Delegate() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { // My implementation return property.getter.call(thisRef) as String } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } } 

Al leer la documentation de Reflection, el getter espera la instancia del object y ningún otro parámetro, pero solo logré el siguiente error. (El error es abreviado porque es demasiado grande, está en recursion).

 . . . at info.malk.Example.getP(Delegation.kt) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at kotlin.reflect.jvm.internal.FunctionCaller$Method.callMethod(FunctionCaller.kt:98) at kotlin.reflect.jvm.internal.FunctionCaller$InstanceMethod.call(FunctionCaller.kt:115) at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:107) at info.malk.Delegate.getValue(Delegation.kt:32) at info.malk.Example.getP(Delegation.kt) . . . Caused by: java.lang.reflect.InvocationTargetException ... 1024 more Caused by: java.lang.StackOverflowError ... 1024 more Process finished with exit code 1 

Ayuda.

La regla de traducción dice:

Por ejemplo, para la propiedad prop se genera la propiedad oculta prop$delegate , y el código de los accesors ( getter / setter ) simplemente delega a esta propiedad adicional.

entonces la propiedad kotlin enviará el getter / setter al delegator . cuando obtiene / establece el valor de una propiedad en los manejadores de delegates ( getValue / setValue ) dará como resultado una llamada recursiva.

su Delegate debería más como esto:

 class Delegate<T> { private var value: T? = null; // ^--- store the proeprty value internal operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return value ?: throw UninitializedPropertyAccessException(); } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value; } } 
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?
  • ¿Cómo get un KType en Kotlin?
  • Obteniendo la class actual
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • ¿Cómo get la reference de class de KParameter en kotlin?
  • ¿Cómo establecer el valor de propiedad delegada por reflexión en kotlin?
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • ¿Cómo uso el object Kotlin por reflexión?
  • La igualdad de class Kotlin falla
  • Kotlin enlazó la incoinheritance de las references invocables