我已经(从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) [...]
或者我完全“吠叫错误的树”,可以这么说?
答案 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的文档,所以希望事情会变得更加清晰。