Wie der Zugriff auf Annotation definiert auf Fall-class-Feld zur Laufzeit
Habe ich den folgenden java-Annotation definiert
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
Und ich habe die folgende scala Fall Klasse definiert:
@Prefer("xyz")
case class TestAnno(arg1 : String, @Prefer("abc") agr2 : String)
Ich bin in der Lage, siehe die Anmerkung definierten Fall Klasse mit der spiegelung, aber ich bin nicht in der Lage, den Zugriff auf die annotation definiert arg2
Mitglied von Fall Klasse TestAnno
. De-kompilieren des Codes sehe ich, dass weder die Deklaration von Variablen oder es ist scala-accessor zu haben scheinen, die annotation. Nur der Konstruktor-definition und copy
Methode scheinen behalten die Anmerkung zum Parameter definiert, wenn die Klasse Erklärung.
Gibt es eine andere Möglichkeit, um Kraft der scala-compiler zum generieren von Annotationen, die für die deklarierten Felder in Fall Klasse oder ich Lesen Sie den Konstruktor und die Benutzung einer Bibliothek wie ASM ByteCode-Bibliothek oder ParaNamer zu ermitteln, welche Parameter haben die Anmerkungen? Benötigen Sie eine Lösung, die arbeiten werden in Erster Linie für Scala case-Klassen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nur Folgendes zu tun :
Mehr info hier http://www.scala-lang.org/api/current/#scala.annotation.meta.package
@setter
,@getter
oder@param
anstelle oder zusammen mit@field
. (Sie können versuchen, mit allen von Ihnen, und entfernen Sie Sie nacheinander.)Quentin ' s Lösung funktioniert, aber IMHO ist es zu viel boilerplate für den Benutzer.
Lesen Sie Anmerkungen auf die Argumente im Konstruktor mit dem standard-reflection-API. Ich brauchte diese für eine makro-Implementierung.
Ich habe einige suchen sich um und kam mit zwei Lösungen. Kommentare, Suggesstions, Verbesserungen sind willkommen, ich habe markiert diese Antwort als wiki. Die erste basiert auf ScalaBeans und ParaNamer.
Der zweite Ansatz verwendet ScalaSignatures und ist auf dieser Basis SO beantworten: