我正在尝试在Scala反射中看到一个注释,到目前为止还没有骰子。我错过了什么?
我的注释:(Java)
@Target({ElementType.PARAMETER}) // Also tried ElementType.CONSTRUCTOR
@Retention(RetentionPolicy.RUNTIME)
public @interface MongoKey {
String info = "";
}
尝试使用Scala反射访问它的部分:
case class One(
@MongoKey name : String,
stuff : List[String]
)
val targetObj = One("FOO", List("a","b"))
val targetType = typeOf[One]
// Given an object (case class) the Type of the case class, and a field name,
// retrieve the typed field object from the case class.
def unpack[T](target: T, t: Type, name: String): (Any, Type) = {
val im = cm.reflect(target)(ClassTag(target.getClass))
val fieldX = t.declaration(newTermName(name)).asTerm.accessed.asTerm
val fm = im.reflectField(fieldX)
(fm.get, fm.symbol.typeSignature) // return the field's value + Type
}
val (pval,pvalType) = SeeMe.unpack(targetObj, targetType, "name")
println(" -> "+pvalType.typeSymbol.annotations)
输出是我的case类'字段的成功遍历,但注释List总是空的,即使我用@MongoKey注释装饰类的字段。我在找错了地方吗?
答案 0 :(得分:5)
这很棘手!注释不在您的类的成员上,而是实际上在您的伴随对象的apply方法中的参数上!
从您的类型中,您应该能够获得伴随对象:
val companion = myType.typeSymbol.companionSymbol
从那里你可以使用反射来查看apply
方法的参数。