Ich habe unter dem groovigen Skript Code in dem Buch angetroffen. Und es erzeugte einige seltsame Ergebnisse für mich.
%Vor%es ist wie folgt ausgegeben:
%Vor%Ich bin also ziemlich verwirrt:
Zur Zeit habe ich herausgefunden, dass @ 245b4bdc ist nicht der " Der Objektverweis ", also HandleMetaClass @ 245b4bdc ist nicht unbedingt die gleiche Instanz wie MetaClassImpl @ 245b4bdc Wir können die Object.is () -Methode verwenden, um zu beurteilen, ob sie gleich sind. (Ich tat das, Ergebnis ist falsch )
warum this.metaClass! = instance.metaClass?
Es beinhaltet Grooves Zugriff auf Felder.
Beim Zugriff auf ein Instanzfeld von " outside " ruft groovy eigentlich die Funktion getFieldName () auf. In meinem Beispiel, wenn ich " instance " verwende, bin ich bei außerhalb ; Daher ruft instance.metaClass instance.getMetaClass () auf.
Wenn Sie von einer Instanz Feld Zugriff auf " innerhalb ", groovy einfach direkt auf das Feld zugreifen, GetFieldName () wird nicht aufgerufen. In unserem Beispiel, wenn ich " dies " verwende, bin ich bei " in "; Also " this.metaClass " greift direkt auf metaClass zu.
Schließlich getMetaClass () gibt ein HandleMetaClass Objekt, während die interne metaclass ein ist MetaClassImpl Objekt. Also this.metaClass! = Instance.metaClass .
Warum this.metaClass.say = {- & gt; println "say"} löst MissingPropertyException aus?
Der Typ dieser.metaClass ist MetaClassImpl
MetaClassImpl ist eine Low-Level-Klasse, die Klassen der oberen Ebene (z. B. HandleMetaClass) für die Injektion unterstützt. Es ist nicht für Entwickler gedacht direkt zu verwenden, so dass es nicht die Injektion Art und Weise unterstützt. xxxx.say = {- & gt; println "sagen"}
Codebeispiel (für Frage 1):
%Vor%Codebeispiel (für Frage 2):
%Vor%