2012-09-06 23 views
9

Estoy tratando de descubrir si el valor de un rasgo tiene una anotación asociada. Después de revisar la API de reflexión Scala 2.10-M7 pensé que el getAnnotations método (que se encuentra en Símbolo) podría ser un gran candidato, pero se está volviendo una lista vacía, como se muestra en la siguiente sesión REPL:¿Cómo se reflejan las anotaciones en 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() 

¿Son esas "anotaciones" las mismas anotaciones con las que trato de lidiar? ¿Cómo puedo saber si a está anotado con W?

Respuesta

6

Parece que un error: https://issues.scala-lang.org/browse/SI-6325

actualización. En realidad, no es un error, sino una combinación de formas no obvias de cómo funcionan las anotaciones en Scala. Hay una forma de hacer que los valores anotados abstractos en los rasgos funcionen como se desee. Eche un vistazo a la discusión en los enlaces antes mencionados para más detalles.

+0

Pensé que las anotaciones de Scala no se conservaron en tiempo de ejecución? –

+1

No se supone que sean visibles mediante la reflexión de Java, pero deben almacenarse encurtidos Scala. Sin embargo, lo que pasé por alto es que necesita subclasar 'StaticAnnotation' o' ClassfileAnnotation' para que funcione. Subclasificar solo 'Annotation' no lo reducirá, al menos según Scaladoc. –

+0

En unos días, cuando tenga tiempo, aclararé el comportamiento previsto, aplicaré correcciones si es necesario y actualizaré la respuesta en consecuencia. –

Cuestiones relacionadas