【问题标题】:How to reflect annotations in Scala 2.10?如何在 Scala 2.10 中反映注释?
【发布时间】:2012-09-06 15:37:29
【问题描述】:

我试图发现一个特征的值是否有一个与之关联的注释。在查看了 Scala 2.10-M7 反射 API 之后,我认为 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 注释?

【问题讨论】:

    标签: scala reflection annotations scala-2.10


    【解决方案1】:

    看起来像一个错误:https://issues.scala-lang.org/browse/SI-6325

    更新。实际上这不是一个错误,而是注释在 Scala 中如何工作的非显而易见方式的组合。有一种方法可以使特征中的抽象注释 val 按需要工作。请查看上述链接中的讨论以了解更多详细信息。

    【讨论】:

    • 我认为 Scala 注释在运行时没有保留?
    • 它们不应该被 Java 反射可见,但它们应该存储在 Scala 泡菜中。我忽略的是,您需要继承 StaticAnnotationClassfileAnnotation 才能使其工作。仅根据 Scaladoc 的子类化 Annotation 不会削减它。
    • 几天后,当我有时间时,我会澄清预期的行为,必要时应用修复并相应地更新答案。
    • bug 仍然存在,因为即使 W 扩展了 StaticAnnotation,getAnnotations 也会返回 Nil。将 a 更改为 def 而不是 val 可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多