2012-09-06 9 views
9

Ich versuche herauszufinden, ob dem Wert eines Merkmals eine Anmerkung zugeordnet ist. Ich den Scala 2,10-M7 Reflection-API Nach der Überprüfung gedacht, dass die Getannotations Methode (in Symbol) könnte ein guter Kandidat sein, aber es ist eine leere Liste zurückkehrt, wie in der folgenden REPL Sitzung gezeigt:Wie reflektiere ich Anmerkungen in Scala 2.10?

scala> class W extends scala.annotation.Annotation 
defined class W 

scala> trait A { @W val a: Int } 
defined trait A 

scala> typeOf[A].members.last 
res0: $r.intp.global.Symbol = value a 

scala> res0.getAnnotations 
res1: List[$r.intp.global.AnnotationInfo] = List() 

Sind diese "Anmerkungen" die gleichen Anmerkungen, die ich versuche zu behandeln? Wie kann ich feststellen, ob ein mit W annotiert ist?

Antwort

6

Sieht aus wie ein Bug: https://issues.scala-lang.org/browse/SI-6325

Update. Eigentlich ist es kein Fehler, sondern eine Kombination von nicht offensichtlichen Methoden, wie Annotationen in Scala funktionieren. Es gibt eine Möglichkeit, abstrakte annotierte Vals in Merkmalen wie gewünscht zu arbeiten. Werfen Sie einen Blick auf die Diskussion auf den oben genannten Links für weitere Details.

+0

Ich dachte Scala Annotationen wurden zur Laufzeit nicht beibehalten? –

+1

Sie sollen nicht durch Java-Reflektion sichtbar sein, aber sie sollten in Scala Pickles gespeichert werden. Was ich jedoch übersehen habe, ist, dass Sie entweder 'StaticAnnotation' oder' ClassfileAnnotation' ableiten müssen, damit dies funktioniert. Subclassing nur "Annotation" wird es nicht schneiden, zumindest nach Scaladoc. –

+0

In ein paar Tagen, wenn ich Zeit habe, werde ich das beabsichtigte Verhalten klären, gegebenenfalls Korrekturen anwenden und die Antwort entsprechend aktualisieren. –

Verwandte Themen