如何查找MethodSymbol的字段注释?

时间:2016-08-24 05:00:51

标签: scala reflection

假设找到了一​​组类型的方法:

case class X()

object A{
   @someannotation
   val x=X()
}

def toType[T](a:T)(implicit tag: TypeTag[T]): Type = tag.tpe

val typ = toType(A)

// Get the public methods that return an X
val intMethods = typ.members.collect{ case m: ru.MethodSymbol if 
   m.isGetter && m.isPublic && m.returnType <:< typeOf[X]  => m }

如何有效地为intMethods的每个元素找到相应的注释?

intMethods.head.annotations

为空,因为typ.decls中有两个用于x的条目。一个是找到的方法,另一个是保存注释的非方法字段。我可以通过匹配搜索:

getAnnotations(intMethods.head.toTerm.name.toString.trim)

def getAnnotations( name: String) ={
  typ.decls.filter{ s=>s.name.toString.trim==name.trim && !s.isMethod}.flatMap(_.annotations)
}

但所有toStringing和trimming都非常慢(修剪是必需的,因为其中一个decls包含一个尾随空格,另一个不包含)。有没有更好的方法直接从MethodSymbol查找相应的类字段?

1 个答案:

答案 0 :(得分:1)

您可以使用accessed方法获取getter的支持字段:

intMethods.head.accessed.annotations

来自documentation

/** Backing field for an accessor method, NoSymbol for all other term symbols. */
abstract def accessed: Universe.Symbol