我有一个用Java编写的简单类级注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Collection {
String name();
}
用过:
@Collection(name="mytable")
case class Foo(...)
我需要在Scala 2.11中内省类以获取name参数的值。我怎样才能获得这些信息?我在这里:
val sym = currentMirror.classSymbol(Class.forName(fullName))
val anno = sym.annotations.head
val annoType = anno.tree.tpe // I can get this...works
println(anno.tree.children.tail) // prints List(name = "mytable")
我很亲密!我可以看到我的名字参数及其值,但这似乎不像地图或任何友好的可访问。如何获取注释参数的值?
答案 0 :(得分:0)
树api实现了产品以获取元素,所以这是一个hacky演示,但你可以得到你的元素:
println(anno.tree.children.last.productElement(1)) // prints "mytable"
答案 1 :(得分:0)
如果您可以使用Jackson处理,那么我将重新使用其注释处理功能,而不是使用scala反射。
object Test {
@Collection(name="mytable")
case class Foo(bar: String)
def main(args: Array[String]): Unit = {
val introspector = new JacksonAnnotationIntrospector
val ac = AnnotatedClass.construct(classOf[Foo], introspector, null)
val annotation = ac.getAnnotations.get(classOf[Collection])
println(annotation.name())
}
}
如果类没有注释,则annotation
为空。