带参数的Scala 2.11反射和注释(Java)

时间:2014-10-29 16:03:57

标签: scala reflection annotations

我有一个用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")

我很亲密!我可以看到我的名字参数及其值,但这似乎不像地图或任何友好的可访问。如何获取注释参数的值?

2 个答案:

答案 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为空。