我试图找到一个与给定的var-args参数匹配的任意类的构造函数。不幸的是,由于我很难理解Scala的反射API,因此我的进展很小。在检索所有可用构造函数的列表后,我无法识别与可用参数匹配的那个。
private lazy val `class` = mirror.staticClass( "myPackage.myClass" )
protected def reflect( arguments: Any* ): T =
{
val constructor = `class`
.toType
.members
.collect{ case method: MethodSymbol if method.isConstructor => method }
.collectFirst[MethodSymbol]{ case _ => null } // ???
.getOrElse( throw new RuntimeException( "No valid constructor given" ) )
mirror
.reflectClass( `class` )
.reflectConstructor( constructor )
.apply( arguments: _* )
.asInstanceOf[T]
}
答案 0 :(得分:4)
我在关于scala reflection, part 1的博客文章中介绍了它。 MethodSymbol
有typeSignature
,我们可以从中评估内容。例如,从帖子中,下面的方法将为您提供所有Int
- 返回对象的方法:
def intMethods[T : TypeTag](v: T) = {
val IntType = typeOf[Int]
val vType = typeOf[T]
val methods = vType.members.collect {
case m: MethodSymbol if !m.isPrivate => m -> m.typeSignatureIn(vType)
}
methods collect {
case (m, mt @ NullaryMethodType(IntType)) => m -> mt
case (m, mt @ MethodType(_, IntType)) => m -> mt
case (m, mt @ PolyType(_, MethodType(_, IntType))) => m -> mt
}
}