2016-08-24 5 views
1
タイプのための一連のメソッドを発見した

と仮定します。MethodSymbolのフィールド注釈の検索方法は?

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 

は、xのtyp.declsに2つのエントリがあるため空です。 1つは見つかったメソッドであり、もう1つはアノテーションを保持する非メソッドフィールドです。

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とトリミングが(declsの一つは、末尾にスペースが含まれている、ので、トリムが必要であり、他のではない)非常に遅いです:私は上のマッチングにより検索することができます。 MethodSymbolから対応するクラスフィールドを直接参照するためのより良い方法はありますか?

答えて

1

あなたはaccessed方法でゲッターのバッキングフィールドを取得することができます。documentationから

intMethods.head.accessed.annotations 

/** Backing field for an accessor method, NoSymbol for all other term symbols. */ 
abstract def accessed: Universe.Symbol 
関連する問題