用反射获取案例类注释?

时间:2016-12-16 02:11:56

标签: scala scala-reflect

我有一个案例类:

case class Foo (@Annotation bar: String)

我希望能够访问该注释及其存储的任何信息

我可以使用scala反射(使用2.11.8)和

来获取案例访问器
val caseAccessors = 
  universe.typeTag[T].
    tpe.
    decls.
    filter(_.isMethod).
    map(_.asMethod).
    filter(_.isCaseAccessor)

但是,当我尝试访问.annotations时,没有任何内容。我意识到注释在技术上是在构造函数参数上,但是我该怎么做呢?

1 个答案:

答案 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]

请参阅scala.annotation.meta

的文档