2

我正在尝试使用 Scala 2.10M7 中的新反射 API 来提取构造函数参数的注释。注释是用 Java 编写的,因为我在运行时需要它们,当我尝试在 Scala 中执行它们时,我收到了一条警告,建议我使用 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 / 检查它是你想要的/ 以某种方式将结果与预期类型匹配 / 得到结果?

4

1 回答 1

1

目前您无法获得注释对象的实例,尽管这是一个好主意。我会尽量在 RC1 之前把它挤进去。更新。糟糕,我们目前处于锁定状态。这将不得不等到 2.10.1:https ://issues.scala-lang.org/browse/SI-6423

av传统的方法是对LiteralAnnotArg, ArrayAnnotArgand进行模式匹配NestedAnnotArg(顺便说一句,这些名称将在 RC1 中更改为 justLiteralArgumentArrayArgument`NestedArgument)。

于 2012-09-25T09:24:47.473 回答