使用Scala 2.10反射查找方法参数(和类型)?

时间:2012-10-12 02:31:36

标签: scala reflection scala-2.10

我已经(从here)学习使用提取器来获取Scala元数据。我也注意到Universe.MethodTypeExtractor

  

用于创建和模式匹配语法的提取器类   MethodType(params, respte)在这里,params是一个潜在的空列表   方法的参数符号,而restpe是结果的类型   方法

大!听起来像我想要的!(?)

但如何获得MethodType? (为什么这是方法“type”的提取器(方法“类型”?)而不是说方法“Def”或“Ref”??)

scala> typeOf[List[Int]].member(newTermName("head"))
res2: reflect.runtime.universe.Symbol = method head

scala> res2 match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

scala> res2.asType match { case MethodType(a, b) => println((a, b)) }
scala.ScalaReflectionException: method head is not a type [...]

scala> res2.asTerm match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

scala> res2.asMethod match { case MethodType(a, b) => println((a, b)) }
scala.MatchError: method head (of class scala.reflect.internal.Symbols$MethodSymbol) [...]

或者我完全“吠叫错误的树”,可以这么说?

1 个答案:

答案 0 :(得分:4)

paramss(这是一个RC1名称,在M7中名为params),returnType是MethodSymbol的方法:

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

scala> typeOf[List[Int]].member(newTermName("head"))
res2: reflect.runtime.universe.Symbol = method head

scala> res2.asMethod.paramss
res4: List[List[reflect.runtime.universe.Symbol]] = List()

scala> res2.asMethod.returnType
res5: reflect.runtime.universe.Type = A

要获取方法的类型签名,您应该调用typeSignature上定义的Symbol方法。

说到为什么方法是类型,这样说并不完全正确。有DefDef树,MethodSymbol符号和MethodType / NullaryMethodType类型 - 每个都在编译器中用于自己的目的。很快我们就会完成反射API的文档,所以希望事情会变得更加清晰。