Как отразить аннотации в Scala 2.10?

Я пытаюсь выяснить, есть ли у значения признака связанная с ним аннотация. Изучив API отражения Scala 2.10-M7, я подумал, что метод getAnnotations (расположенный в Symbol) может быть отличным кандидатом, но он возвращает пустой список, как показано в следующем сеансе REPL:

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()

Эти «аннотации» - это те же аннотации, с которыми я пытаюсь работать? Как я могу узнать, помечен ли a с помощью W?


person jeslg    schedule 06.09.2012    source источник


Ответы (1)


Похоже на ошибку: https://issues.scala-lang.org/browse/SI-6325

Обновить. На самом деле это не ошибка, а комбинация неочевидных способов работы аннотаций в Scala. Есть способ заставить абстрактные аннотированные валы в чертах работать так, как нужно. Взгляните на обсуждение по вышеупомянутым ссылкам для получения более подробной информации.

person Eugene Burmako    schedule 06.09.2012
comment
Я думал, что аннотации Scala не сохраняются во время выполнения? - person Daniel C. Sobral; 08.09.2012
comment
Они не должны быть видимы отражением Java, но они должны храниться в рассолах Scala. Однако я упустил из виду то, что вам нужно создать подкласс либо StaticAnnotation, либо ClassfileAnnotation, чтобы это работало. Создание подкласса просто Annotation не поможет, по крайней мере, согласно Scaladoc. - person Eugene Burmako; 08.09.2012
comment
Через несколько дней, когда у меня будет время, я уточню предполагаемое поведение, при необходимости внесу исправления и соответствующим образом обновлю ответ. - person Eugene Burmako; 08.09.2012
comment
Ошибка все еще сохраняется, потому что даже если W расширяет StaticAnnotation, getAnnotations возвращает Nil. Изменение a на def вместо val устраняет проблему. - person Eugene Burmako; 08.09.2012