我正在尝试使用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 /检查它是一个你想要/匹配结果到期望的类型某种方式得到结果?
答案 0 :(得分:1)
目前您无法获得注释对象的实例,尽管这是一个不错的主意。我会试着在RC1之前把它挤进去。 UPD。哎呀,我们现在处于锁定状态。这必须等到2.10.1:https://issues.scala-lang.org/browse/SI-6423
传统方式是av
与LiteralAnnotArg
,ArrayAnnotArg
和NestedAnnotArg
进行模式匹配(顺便说一下,这些名称会在RC1中更改为LiteralArgument
,ArrayArgument
和`NestedArgument)。