Wie kann ich das Objekt erhalten, auf das sich die Scala 2.10 Reflexion bezieht?

8

Bitte beachten Sie diesen Code:

%Vor%

Ich kann die Symbol wie folgt auf dieses Objekt beziehen:

%Vor%

Wie kann ich nun das aktuelle Objekt ResponseType erhalten?

    
Nikita Volkov 26.08.2012, 08:45
quelle

1 Antwort

13
%Vor%

Nun ist eine Erklärung in Ordnung, da dies ein ziemlich undurchsichtiges Implementierungsdetail ist, das wir (noch) nicht in der öffentlichen API abstrahieren konnten.

Für jedes object erstellt Scala eine zugrunde liegende Klasse, die ihre Signatur darstellt, intern als Modulklasse bezeichnet. Wenn Sie zum Beispiel object C kompilieren, generiert der Compiler C$.class . Das ist genau die Modulklasse.

Beachten Sie, dass Modulklassen sich von Companion-Klassen unterscheiden. Angenommen, für case class C generiert der Compiler drei Symbole: type C , term C und (ein anderes) type C , wobei das erste type C für die Klasse C steht (die automatisch generierte Kopien, productPrefix, productArity etc) und das zweite type C repräsentiert eine Signatur von Objekt C (welches automatisch generierte Factory, Extractor usw. enthält). Es wird keine Namenskonflikte geben, da die Modulklasse nicht direkt zur Symboltabelle hinzugefügt wird und nur über <module>.moduleClass verfügbar ist.

Was du also von deiner typeOf[ResponseType.Value].asInstanceOf[TypeRef].pre.typeSymbol Beschwörung erhältst, ist ein Symbol, das für eine Modulklasse steht. In der API gibt es keine Funktion, mit der Sie von einer Modulklasse zu einem Modulsymbol gelangen. Intern im Compiler gibt es sicherlich einen, aber wir haben uns entschieden, dieses Implementierungsdetail nicht zu veröffentlichen, weil es sich sehr bald ändern könnte.

Um zu einem Quellmodul zu gelangen, müssen Sie zu owner gehen, einen Blick in die Liste seiner Mitglieder werfen und dort ein Objekt suchen, das denselben Namen wie die Modulklasse hat. Genau das macht moduleClass.owner.typeSignature.member(moduleClass.name.toTermName) . Ein kleiner Vorbehalt ist, dass member ein überladenes Symbol zurückgibt, wenn Sie im selben Bereich eine Methode mit demselben Namen haben, und Sie müssen etwas wie .member(...).suchThat(_.isModule) machen.

Danach ist es ein Stück Kuchen.

Bearbeiten. Eigentlich denken wir darüber nach, ClassSymbol.module einzuführen, das andernfalls das Quellmodulsymbol für eine Modulklasse und ein NoSymbol zurückgeben würde. Wahrscheinlich wird dies in RC1 enden. Befolgen Sie die Versionshinweise.

    
Eugene Burmako 26.08.2012, 10:15
quelle

Tags und Links