如何从Scala 2.10中的ClassFileAnnotArg中提取信息

时间:2012-09-25 07:40:15

标签: scala reflection scala-2.10

我正在尝试使用Scala 2.10M7中的新反射API来提取构造函数参数的注释。注释是用Java编写的,因为我在运行时想要它们,当我在Scala中尝试使用Java时,我收到一条警告,建议我使用Java。

我已经为每个构造函数参数和注释成功地获得了一个符号......但我最终得到了ClassFileAnnotArg类型的东西(下面代码中的av)。我不知道如何处理这些问题。查看源代码/ scaladocs看起来我想分开一些案例类,但我无法弄清楚如何这样做。

我不认为这个问题特定于构造函数args上的注释,但我想对它们使用更详细的scala反射,而不能只使用Java注释反射机制。

import scala.reflect.runtime._
val ty = universe.typeOf[Test1]
val constructors = ty.member(universe.nme.CONSTRUCTOR)
for (constructor<-constructors.asTerm.alternatives.map{_.asMethod}) {
  println("Constructor = "+constructor)
  println("Overloaded = "+constructor.isOverloaded)
  for (pp<-constructor.params) {
    println("Constructor params")
    for (p<-pp) {
      println("  name="+p.name)
      println("  type="+p.typeSignature)
      for (a<-p.getAnnotations) {
        println("  annotation "+a.atp)
        for ((aname,av)<-a.assocs) {
          println("     "+aname.decoded+"="+av)
        }
      }
    }
  }
}

有没有办法获取注释对象的实例(就像在Java注释中那样),或者你必须通过getAnnotations /检查它是你想要/迭代通过assocs /检查它是一个你想要/匹配结果到期望的类型某种方式得到结果?

1 个答案:

答案 0 :(得分:1)

目前您无法获得注释对象的实例,尽管这是一个不错的主意。我会试着在RC1之前把它挤进去。 UPD。哎呀,我们现在处于锁定状态。这必须等到2.10.1:https://issues.scala-lang.org/browse/SI-6423

传统方式是avLiteralAnnotArgArrayAnnotArgNestedAnnotArg进行模式匹配(顺便说一下,这些名称会在RC1中更改为LiteralArgumentArrayArgument和`NestedArgument)。