在scala中,对case类classtag使用反射来查找伴随对象的apply方法

时间:2014-05-28 20:35:00

标签: scala reflection

这与以下问题有关,但由于它涉及一个明显且突出的问题,我将其视为后续问题:Support generic deserialization from a List[(String, Any)] in Scala

如何使用反射来查找ClassTag的伴随对象的方法?具体来说,我试图调用案例类的apply方法'伴侣对象反射性地构造案例类的实例。

1 个答案:

答案 0 :(得分:3)

可以this answer帮助你吗?

以下是scalaVersion := "2.11.1"

的示例
import scala.reflect.runtime.{universe => u}

def companionMembers(clazzTag: scala.reflect.ClassTag[_]): u.MemberScope = {
  val runtimeClass = clazzTag.runtimeClass
  val rootMirror = u.runtimeMirror(runtimeClass.getClassLoader)
  val classSymbol = rootMirror.classSymbol(runtimeClass)
  // get the companion here
  classSymbol.companion.typeSignature.members
}

case class MyClass(value: Int)

val applyMethods =
  companionMembers(scala.reflect.classTag[MyClass])
  .filter { m => m.isMethod && m.name.toString == "apply"}

println(applyMethods)

打印

Scope{
  case def apply(value: scala.Int): MyClass
}