使用scala 2.10反射API获取方法参数类型

时间:2012-07-20 21:59:07

标签: scala reflection

使用Java反射API获取方法的参数类型列表,我们只需使用getParameterTypes

以下是一个例子:

scala> classOf[String].getMethods.head.getParameterTypes

res8: Array[Class[_]] = Array(class java.lang.Object)

使用新的Scala 2.10 Reflection API获得相同结果的最佳做法是什么?

1 个答案:

答案 0 :(得分:11)

这更难,因为Scala反射做得更多,需要更多。例如:

  • 类型不会被删除。这些类被删除,但不是类型。
  • Scala支持命名参数,因此您需要参数名称。
  • Scala的方法没有参数列表。

所以,鉴于这一切,这就是你如何做到的。首先,获取方法:

val stringMethods: Iterable[MethodSymbol] = typeOf[String].members.collect { 
  case m if m.isMethod => m.asMethod 
}

Scala反射(尚未)提供列出特定类型成员(方法,字段,内部类等)的方法,因此您需要使用常规members方法。

为所有类型的成员工作,members方法返回Symbol的迭代,这是所有符号的最大公分母,因此您需要转换为MethodSymbol来对待结果符号作为方法。

现在,假设我们有MethodSymbol,我们想要参数类型。我们可以这样做:

method.paramss