我想通过反射在对象上调用一个方法,其中方法的每个参数都应该设置为指定其类型的值。更具体一点:我有Map[reflect.runtime.universe.Symbol,Any]
其中Symbol
是一种类型,例如List
,Double
,String
和Any
是要使用的实例。
现在,对于方法的每个参数,我想查询地图并相应地设置参数。
我使用typeOf[T].members.collect ...
来获取方法scala.reflect.MethodSymbol
,但我不知道如何获取正确的Symbol
。 method.paramss
中的元素例如是val a
,但不是Symbol
类型的a
。
答案 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)
我认为你想要的是什么。