2013-04-18 5 views

答えて

39

MethodSymbolにそれらを圧送する予定フィールド法

def getMethods[T:TypeTag](t:T) = typeOf[T].members.collect { 
    case m:MethodSymbol => m 
    } 

引き出していない以下の使用たとえば は、あなたが正確にこれを行うことができます isCaseAccessor方法があります。

def getMethods[T: TypeTag] = typeOf[T].members.collect { 
    case m: MethodSymbol if m.isCaseAccessor => m 
}.toList 

次のように書くことができます。

scala> case class Person(name: String, age: Int) 
defined class Person 

scala> getMethods[Person] 
res1: List[reflect.runtime.universe.MethodSymbol] = List(value age, value name) 

あなたが望むメソッドシンボルだけが得られます。

+0

ああ私のアプローチが間違っていたことがわかった。どのようにして不明なケースクラスからcaseAccessorsを取得するか?現在valとして格納されているIEのものSomeCaseClass:Any –

+0

待機中、取得できません currentMirror.reflect(someCaseClass).symbol.asType.typeSignature.members –

+0

これは、スカラー2.10でマルチスレッド環境で動作しますか? – jilen

10

あなたが好きな人は、コンストラクタシンボルを調べることで順番に取得できます。問題のcaseクラス型に複数のコンストラクターが定義されている場合でも、このコードは機能します。

import scala.collection.immutable.ListMap 
    import scala.reflect.runtime.universe._ 

    /** 
    * Returns a map from formal parameter names to types, containing one 
    * mapping for each constructor argument. The resulting map (a ListMap) 
    * preserves the order of the primary constructor's parameter list. 
    */ 
    def caseClassParamsOf[T: TypeTag]: ListMap[String, Type] = { 
    val tpe = typeOf[T] 
    val constructorSymbol = tpe.decl(termNames.CONSTRUCTOR) 
    val defaultConstructor = 
     if (constructorSymbol.isMethod) constructorSymbol.asMethod 
     else { 
     val ctors = constructorSymbol.asTerm.alternatives 
     ctors.map(_.asMethod).find(_.isPrimaryConstructor).get 
     } 

    ListMap[String, Type]() ++ defaultConstructor.paramLists.reduceLeft(_ ++ _).map { 
     sym => sym.name.toString -> tpe.member(sym.name).asMethod.returnType 
    } 
    } 
+0

私は 'scala.ScalaReflectionException:は' constructorSymbol.asTerm.alternatives'という表現の中の用語ではありません。 'declaration'のドキュメンテーションコメントは' OverloadedSymbol'を参照していますが、そのようなエンティティは存在しないようです。 –

+0

問題のケース・クラスのスーパータイプとして使用されている形質から 'this.type'を呼び出していたので、それが起こっていたことが判明しました。 –

+0

また、 'caseクラスP(i:Int)(j:Int)'です。 –

関連する問題