Groovy: this.metaClass Versus instance.metaClass

8

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:

  1. Warum ist this.metaClass nicht instance.metaClass?
  2. Außerdem kann ich diese.metaClass nicht verwenden, um neue Methoden zu injizieren; groovy sagt mir, dass diese.metaClass keine solche Eigenschaft hat, die ich injizieren wollte.
  3. Was bedeutet "org.codehaus.groovy.runtime.HandleMetaClass@245b4bdc [groovy.lang.MetaClassImpl@245b4bdc [Klasse Person]]" bedeuten? Ich weiß, dass "245b4bdc" der Objektzeiger sein kann. Aber warum haben HandleMetaClass und MetaClassImpl den gleichen Zeigerwert "245b4bdc"?

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 )

    
Guocheng 24.12.2015, 08:24
quelle

1 Antwort

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

  2. 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%     
Guocheng 25.12.2015, 12:52
quelle

Tags und Links