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

Sag*_*ich 3 reflection scala

使用Java反射API,获取方法的参数类型列表,我们可以简单地使用getParameterTypes.

这是一个例子:

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

res8: Array[Class[_]] = Array(class java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ral 11

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

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

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

val stringMethods: Iterable[MethodSymbol] = typeOf[String].members.collect { 
  case m if m.isMethod => m.asMethod 
}
Run Code Online (Sandbox Code Playgroud)

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

对于所有类型的成员,该members方法返回Symbol所有符号的最大公分母的可迭代,因此您需要转换MethodSymbol为将结果符号视为方法.

现在,假设我们有一个MethodSymbol,我们想要各种类型的参数.我们做得到:

method.paramss
Run Code Online (Sandbox Code Playgroud)

  • 丹尼尔,谢谢你的回答.它工作得很好,但我很惊讶scala反射API没有封装这个功能,这似乎是基本的. (2认同)