2017-06-17 4 views
0

Ich lerne Kotlin, aktuell mit Fedora 25 OpenJDK 8 und Kotlin 1.1.Kotlin Reflection Operator get Implementierung

kopierte ich das Beispiel von der Kotlin Website: https://kotlinlang.org/docs/reference/delegated-properties.html und den get-Operator geändert.

Beim Lesen der Reflection-Dokumentation erwartet der Getter die Objektinstanz und keinen anderen Parameter, aber ich habe nur den folgenden Fehler erhalten. (Fehler ist abkürzen, weil es zu groß ist, ist es in Rekursion ist.)

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

Hilfe.

+0

Sie rekursiv die Getter für 'P' aufrufen. Was willst du erreichen? – nhaarman

+0

Ich vermute, das war der Fall, ich möchte Hilfe, um den Getter durch Reflexion/Delegation zu implementieren. – Malkaviano

Antwort

2

Translation Rule sagt:

Zum Beispiel für die Eigenschaft prop die verborgene Eigenschaft prop$delegate erzeugt wird, und der Code der Accessoren (Getter/Setter) einfach Delegierten auf diese zusätzliche Eigenschaft.

so die Kotlin Eigenschaft schicken die Getter/setter zum delegator. Wenn Sie bekommen/setzen der Wert auf einer Eigenschaft in den Delegate-Handlern (getValue/setValue) wird in rekursiven Aufruf führen.

Ihre Delegate sollte mehr wie folgt aus:

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

Okay, ich habe das Beispiel aus dem falschen Winkel angegangen, es soll zeigen, wie man den Zustand außerhalb der Klasse hält? Wie ein Repository oder etwas zu bauen. Ich habe wirklich die feste Idee, auf den Delegator-Staat zuzugreifen, jetzt denke ich klar, dass es wenig Sinn macht. – Malkaviano

+0

@Malkaviano Nicht in Ordnung. Sie können entscheiden, wie Sie den 'Delegierten' implementieren. –

+0

Ich kann meinen Kommentar nicht bearbeiten, ich habe einen Übersetzungsfehler gemacht. Mit "fester Idee" meinte ich starres Denken. – Malkaviano

Verwandte Themen