Bitte beachten Sie diesen Code:
%Vor% Ich kann die Symbol
wie folgt auf dieses Objekt beziehen:
Wie kann ich nun das aktuelle Objekt ResponseType
erhalten?
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.
Tags und Links scala reflection scala-2.10