我有一个案例类:
case class Foo (@Annotation bar: String)
我希望能够访问该注释及其存储的任何信息
我可以使用scala反射(使用2.11.8)和
来获取案例访问器val caseAccessors =
universe.typeTag[T].
tpe.
decls.
filter(_.isMethod).
map(_.asMethod).
filter(_.isCaseAccessor)
但是,当我尝试访问.annotations
时,没有任何内容。我意识到注释在技术上是在构造函数参数上,但是我该怎么做呢?
答案 0 :(得分:3)
您的@Annotation
将同时位于构造函数参数和协同对象apply
方法中,您可以按名称查找它们。我不认为存在过滤掉构造函数/主构造函数/伴随对象工厂方法的特定方法。这两个都应该有效:
universe.typeTag[Foo]
.tpe
.declarations
.find(_.name.toString == "<init>")
.get
.asMethod
.paramss
.flatten
.flatMap(_.annotations)
universe.typeTag[Foo.type]
.tpe
.declarations
.find(_.name.toString == "apply")
.get
.asMethod
.paramss
.flatten
.flatMap(_.annotations)
(虽然我在Scala 2.11.8上并且没有decls
但是那里有declarations
)
如果您想将注释放在字段或getter上,请使用scala.annotation.meta
包:
import scala.annotation.meta
case class Foo (@(Annotation @meta.getter) bar: String)
在这种情况下,您的代码将有效(如果您在T
中将Foo
更改为typeTag[T]
)