我想反射创建给定对象的副本(此对象称为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== ???))
答案 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)