通过反射得到`方法参数的符号

时间:2013-05-04 17:21:07

标签: scala reflection

我想通过反射在对象上调用一个方法,其中方法的每个参数都应该设置为指定其类型的值。更具体一点:我有Map[reflect.runtime.universe.Symbol,Any]其中Symbol是一种类型,例如ListDoubleStringAny是要使用的实例。

现在,对于方法的每个参数,我想查询地图并相应地设置参数。

我使用typeOf[T].members.collect ...来获取方法scala.reflect.MethodSymbol,但我不知道如何获取正确的Symbolmethod.paramss中的元素例如是val a,但不是Symbol类型的a

1 个答案:

答案 0 :(得分:3)

method.paramss为您提供每个参数包含TermSymbol的列表列表(每个参数列表一个列表)。每个TermSymbol都有typeSignature方法,该方法返回Type,其中typeSymbol方法可以为您提供所需的符号。

例如:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> class Foo { def foo(s: String, i: Int) = s * i }
defined class Foo

scala> val params = typeOf[Foo].member(newTermName("foo")).asMethod.paramss.head
params: List[reflect.runtime.universe.Symbol] = List(value s, value i)

scala> params.map(_.typeSignature.typeSymbol)
res0: List[reflect.runtime.universe.Symbol] = List(class String, class Int)

我认为你想要的是什么。