Scala Reflection:如何通过反射找到无参数构造函数(如果有多个构造函数)?什么是“no-arg”的类型签名?

时间:2014-02-26 18:31:01

标签: scala reflection

我想反射创建给定对象的副本(此对象称为root)。

为此,我需要创建root类的实例。

我尝试了给出的建议 http://docs.scala-lang.org/overviews/reflection/overview.html 但它不适用于具有多个构造函数的对象。

  • 如何找到no-arg构造函数?

  • 我的猜测是我应该使用像asTerm.alternatives.filter(_.typeSignature== ???))这样的东西来找到no-arg构造函数,但我不确定,这是正确的方法吗?

  • 即使这是要走的路,如果我正在寻找一个无参数的构造函数,我也不知道应该代替???

  • 换句话说,no-arg构造函数的类型签名是什么?

在下面的代码中root是我想要找到的无参数构造函数的对象。

代码:

  val m= runtimeMirror(getClass.getClassLoader)
  val rootsMirror: InstanceMirror =m.reflect(root)
  val theType: Type =m.reflect(root).symbol.toType
  val classSymbol : ClassSymbol =m.reflect(root).symbol
  val classMirror:ClassMirror=m.reflectClass(classSymbol)
  val constructorMirror: MethodMirror = classMirror.reflectConstructor(
    theType.declaration(nme.CONSTRUCTOR).asTerm.alternatives.filter(_.typeSignature== ???))

1 个答案:

答案 0 :(得分:3)

类似的东西:

scala> class X(i: Int) { def this() = this(1) }
defined class X

scala> typeOf[X].declarations.filter { s => s.isMethod && {
     | val m = s.asMethod
     | m.isConstructor && m.paramss.flatten.isEmpty }}
res2: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(constructor X)

与类型有点不同:

scala> res5 filter (_ match { case MethodType(ps, t) if ps.isEmpty => true case _ => false })
res7: Iterable[reflect.runtime.universe.Type] = List(()X)