如果您想要更有趣,可以通過檢查構造函數符號來獲得它們。即使有問題的案例類類型有多個定義的構造函數,此代碼也可以工作。
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
}
}
啊我現在意識到我的方法是錯誤的。任何想法如何從一個未知案例類獲取caseAccessors? IE之一,目前存儲爲val SomeCaseClass:任何 –
等待,沒有得到它 currentMirror.reflect(someCaseClass).symbol.asType.typeSignature.members –
可以在scala 2.10下使用多線程環境嗎? – jilen