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: doble operador de colon (reflexión) sobre
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • Quiero detectar si una class JVM es una class Kotlin o no
  • Obtén la function por nombre dinámicamente en Kotlin
  • ¿Cómo obtengo una KProperty1 de una KProperty0?
  • La delegación de propiedad kotlin alias lanza Exception
  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • Reflexión de KFlin KFunction - get valores de parameters