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; } } 
  • Determinar si una instancia es una instancia de una class de datos
  • instancia :: class.java vs. instance.javaClass
  • Quiero detectar si una class JVM es una class Kotlin o no
  • La delegación de propiedad kotlin alias lanza Exception
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • Llamadas a function de logging usando reflexión en kotlin
  • Interoperabilidad de reflexión de Kotlin con Java
  • ¿Cómo obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?
  • String.intern () devuelve diferentes valores en un controller JDBC
  • kotlin reflexión verificación nullable types