6

我(从这里)学会了使用提取器来获取 Scala 元数据。我还注意到Universe.MethodTypeExtractor

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

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

但是如何获得MethodType?(为什么这是方法“类型”的提取器(方法是“类型”?)而不是方法“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) [...]

或者我完全是“找错了树”,可以这么说?

4

1 回答 1

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 的文档,因此希望事情会变得更加清晰。

于 2012-10-12T08:25:05.010 回答