scala 2.10で新しいリフレクションモデルを使用して、スカラのケースクラスからフィールド値を抽出するにはどうすればよいですか?私はScala 2.10リフレクション、ケースクラスからフィールド値を抽出する方法
for {field <- fields} {
currentMirror.reflect(caseClass).reflectField(field).get
}
scala 2.10で新しいリフレクションモデルを使用して、スカラのケースクラスからフィールド値を抽出するにはどうすればよいですか?私はScala 2.10リフレクション、ケースクラスからフィールド値を抽出する方法
for {field <- fields} {
currentMirror.reflect(caseClass).reflectField(field).get
}
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)
あなたが望むメソッドシンボルだけが得られます。
あなたが好きな人は、コンストラクタシンボルを調べることで順番に取得できます。問題の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
}
}
私は 'scala.ScalaReflectionException:
問題のケース・クラスのスーパータイプとして使用されている形質から 'this.type'を呼び出していたので、それが起こっていたことが判明しました。 –
また、 'caseクラスP(i:Int)(j:Int)'です。 –
ああ私のアプローチが間違っていたことがわかった。どのようにして不明なケースクラスからcaseAccessorsを取得するか?現在valとして格納されているIEのものSomeCaseClass:Any –
待機中、取得できません currentMirror.reflect(someCaseClass).symbol.asType.typeSignature.members –
これは、スカラー2.10でマルチスレッド環境で動作しますか? – jilen