在运行时获取Scala 2.10注释值

时间:2013-12-20 18:59:10

标签: scala reflection annotations

所以我有一个文档注释,如下所示:

case class DocProp(name: String = "", dataType: Class[_] = classOf[Object])

我们的想法是,默认情况下我们会反省字段并查看ID和返回类型,但在某些情况下需要覆盖。

我想将它放在我的模型案例类的字段中,因此我将其重新声明为type @field

type DocProperty = DocProp @field

然后在以下不同场景中使用它:

case class MyModel(
    // 1. use reflection to inspect the property
    @DocProperty
    prop1: Int,

    // 2. override the name
    @DocProperty(name = "myProp")
    prop2: String,

    // 3. override the return type
    @DocProperty(dataType = classOf[String])
    prop3: Option[String],

    // 4. override everything
    @DocProperty("myOtherProp", classOf[Number])
    prop4: Float,

    // 5. don't document this one at all
    hiddenProp: String
)

我终于设法挖掘了runtimeMirrors的各个层次以及值{及其关联注释的Symbols,并挖掘出DocProp注释:

// val mc = classOf[MyModel] // passed in
import scala.reflect.runtime.{universe => ru}
val mirror = ru.runtimeMirror(mc.getClassLoader)
val members = mirror.classSymbol(mc).asType.typeSignature.members

val allProps = (for (m <- members) yield {
  val a8ns = m.annotations
  val a8n = a8ns.find(a => a.tpe <:< ru.typeOf[DocProp])
  a8n match {
    case Some(found) => Some((m, found))
    case _ => None
  }
}).flatten

这只为注释属性提供了(Symbol, Annotation)的迭代(我仍然需要反射案例的符号)。

但我现在在reflect.runtime.universe.Trees的丛林深处,对我来说如何离开并不明显。我如何从

获得
reflect.runtime.universe.Tree = classOf[java.lang.Number]

到实际的Class[Number]值?我如何从

获得
reflect.runtime.universe.Tree = doc.this.DocProp.<init>$default$1

到空字符串,甚至到1

1 个答案:

答案 0 :(得分:1)

到目前为止,没有简单的方法可以实现这一目标。使用ToolBox.eval是我想到的解决方法。我们的JIRA中也存在类似的问题,即谈论获取Java注释的值:https://issues.scala-lang.org/browse/SI-6423