2

我正在尝试找到与给定 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]
}
4

1 回答 1

4

我在关于scala 反射的博客文章中介绍了它,第 1 部分。AMethodSymbol有一个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
  }
}
于 2013-08-27T01:01:07.037 回答