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; } } 
  • Crear una nueva instancia de una KClass
  • String.intern () devuelve diferentes valores en un controller JDBC
  • Configurar la reflexión de kotlin, class.java no funciona
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • Kotlin language obtiene class en time de ejecución
  • kotlin reflexión verificación nullable types
  • ¿Cómo get una KClass de Array?
  • Llamadas a function de logging usando reflexión en kotlin
  • ¿Cómo get la reference de class de KParameter en kotlin?
  • Obteniendo la class actual