Kotlin反射操作符得到实现

我正在学习Kotlin,目前使用的是Fedora 25 OpenJDK 8和Kotlin 1.1。

我复制了Kotlin网站的示例: https : //kotlinlang.org/docs/reference/delegated-properties.html并更改了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.'") } } 

读取反射文档getter期望对象实例,没有其他参数,但我只实现了以下错误。 (错误是因为它太大而缩写的,它是递归的。)

 . . . 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 

帮帮我。

翻译规则说:

例如,对于属性prop ,隐式属性prop$delegate被生成,并且访问器( getter / setter )的代码只是委托给这个附加属性。

所以kotlin 属性将派遣getter / setterdelegator 。 当你得到/设置 代理处理程序( getValue / setValue )周围属性的值将导致递归调用。

你的Delegate应该更像这样:

 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; } }