斯卡拉2.11反射和说明(JAVA)与参数

问题描述:

我用Java编写的一个简单的类级注解:斯卡拉2.11反射和说明(JAVA)与参数

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Collection { 
    String name(); 
} 

使用,如:

@Collection(name="mytable") 
case class Foo(...) 

我需要反思在斯卡拉2.11课获取名称参数的值。我怎样才能得到这个信息?我在这里:

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") 

我很接近!我可以看到我的名字参数和它的值,但是这似乎不像Map或任何友好的东西。我如何获得我的注释参数的值?

树API实现产品获得元素了,所以这是一种哈克论证的,但你可以得到你的元素:

println(anno.tree.children.last.productElement(1)) // prints "mytable" 

如果你能处理使用杰克逊,那么我会重新 - 使用其注释处理功能而不是使用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为空。