Zugriff auf einen Annotation-Wert in Scala

8

TL; DR: Grundsätzlich suche ich nach dem Scala-Äquivalent des Java:

%Vor%

Trotz der Tatsache, dass ich Annotationen und Abfragen basierend auf ihrem Typ entdecken kann, kann ich nicht von einem scala.reflect.runtime.universe.Annotation in meinen tatsächlichen Typ gelangen.

%Vor%

Der freudige Teil über all das ist, dass ich nicht einmal die traditionelle Java-Methode verwenden kann, selbst wenn ich das wollte, da Scala es nicht mehr aushält, das Array von getAnnotations() zu füllen.

%Vor%

Verwandte

Ich denke, was ich will ist eine Art von "Reflection Overview" im Abschnitt " Einen Typ zur Laufzeit instanziieren, "aber ich sehe nicht, warum ich so viele Ringe überspringen müsste, nur um die Werte in einer Annotation zu erhalten. In Java ist der Wert nur weggeworfen.

Die Frage "Siehe Anmerkungen in Scala Reflexion" scheint verwandt zu sein, aber die Frage stammt aus 2011 und bezieht sich auf Scala 2.9. Ich benutze 2.10 und von dem, was ich sagen kann, hat sich eine große Menge davon, wie Reflektion funktioniert, seitdem geändert.

    
Travis Gockel 13.04.2014, 18:52
quelle

3 Antworten

6

Nicht das Java-Äquivalent, aber mit scala 2.11.6 funktioniert das, um Werte aus einer Annotation zu extrahieren:

%Vor%

Ich verstehe, dass Sie es vielleicht bereits getan haben, aber nur für den Fall, dass es jemandem helfen kann:)

    
Remi Thieblin 31.05.2016 22:27
quelle
5

In ihrer aktuellen Form versuchen Scala-Annotationen, Java-Kompatibilität zu kombinieren (was nur konstante Argumente und eine sehr begrenzte Anzahl von in Annotationen erlaubten Sprachkonstrukten impliziert) und ultimative Flexibilität (was bedeutet, alles zu erlauben, was man sich in Annotationen vorstellen kann). p>

Dies wird durch die Unterscheidung ClassfileAnnotation (Kompatibilität) vs StaticAnnotation (Flexibilität) manifestiert. Gemäß dieser Idee kann man zwischen einer Java-artigen Reflexion mit begrenzten Anmerkungen, die als Objekte verfügbar sind, und einer Scala-artigen Reflexion mit voll flexiblen Annotationen, die nur als abstrakte Syntaxbäume verfügbar sind, wählen (beachten Sie, dass wir statische Annotationen nicht automatisch in Laufzeitobjekte konvertieren können) , weil Code, der in solchen Annotationen gespeichert wird, beliebige Scala-Ausdrücke enthalten kann, was es sehr schwierig macht, sie auszuwerten.)

Leider wird dieses idealistische Bild durch die Tatsache unterbrochen, dass Klassendatei-Annotationen keine Laufzeitspeicherung unterstützen: Ссылка , was bedeutet, dass man nicht wirklich wählen kann - nur Scala-Stil-Reflektion wird im Moment unterstützt. Hoffentlich werden wir eines Tages SI-32 reparieren, aber ich bin mir keiner laufenden Bemühungen bewusst, um es zum Laufen zu bringen.

Vor ein paar Monaten wollte ich etwas wie scala.reflect.Annotation.eval implementieren, das eine Annotation im Scala-Stil nehmen und wenn möglich auswerten würde. Nach einer Diskussion während einer unserer Reflexionssitzungen haben wir uns jedoch dagegen entschieden, da diese API neben einer unglücklichen Nicht-Allgemeinheit auch Probleme bei der Kompilierzeit-Reflektion mit sich bringen würde (was in Scala mit Laufzeitreflexion vereinheitlicht ist).

Dies wurde als Problem bei Ссылка protokolliert und auch unter Ссылка , aber im Moment keine konkreten Pläne für Verbesserungen. Hoffentlich wird Project Palladium hier helfen, denn eine seiner Kernkomponenten ist ein Scala-Interpreter, der die notwendige allgemeine Unterstützung für Annotation.eval bietet.

    
Eugene Burmako 14.04.2014 16:12
quelle
0

Ohne auf den scala-Compiler angewiesen zu sein, ist dies meine Version:

%Vor%

Der vorherige Code funktioniert nur, wenn die Argumente primitiv sind, vermute ich.

Wenn wir es uns leisten können, vom scala-Compiler abhängig zu sein, dann können wir etwas tun wie:

%Vor%     
lqbweb 22.07.2016 13:24
quelle

Tags und Links