问题描述
在反映类foo()
的{{1}}方法时,我们可以使用以下内容轻松获得具体的返回类型。
Cls
但是,如果我们在运行时通过工具箱定义类class Cls {
def foo() =
List("A","B")
}
val classtype = ru.typeOf[Cls]
val classMirror = toolBox.mirror.reflectClass(classtype.typeSymbol.asClass)
val ctorSymbol = classtype.decl(ru.termNames.CONSTRUCTOR).asMethod
val methodSymb = classtype.decl(ru.TermName("foo")).asMethod
val ctor = classMirror.reflectConstructor(ctorSymbol)
val instance = ctor()
val im = toolBox.mirror.reflect(instance)
val foo = im.reflectMethod(methodSymb)
println(foo()) // List(A,B)
println(methodSymb.returnType) // List[String]
,然后使用相同的方法反映过程,我们将仅获得{{1}的抽象返回类型(Cls
) }方法。
List
为什么这些代码段会产生不同的结果?
如果在运行时使用工具箱定义了foo()
,我们如何反映import ru._
val tree =
q"""class Cls {
def foo() =
List("A","B")
}""".asInstanceOf[ru.ClassDef]
val classSymbol = toolBox.define(tree).asClass
val classtype = classSymbol.selfType
val classMirror = toolBox.mirror.reflectClass(classtype.typeSymbol.asClass)
val ctorSymbol = classtype.decl(ru.termNames.CONSTRUCTOR).asMethod
val methodSymb = classtype.decl(ru.TermName("foo")).asMethod
val ctor = classMirror.reflectConstructor(ctorSymbol)
val instance = ctor()
val im = toolBox.mirror.reflect(instance)
val foo = im.reflectMethod(methodSymb)
println(foo()) // List("A","B")
println(methodSymb.returnType) // List
方法的具体返回类型?
解决方法
我想这是类型擦除。
尝试替换
val classType = classSymbol.selfType
使用
val classType = toolbox.eval(q"scala.reflect.runtime.universe.typeOf[$classSymbol]").asInstanceOf[ru.Type]
然后methodSymb.returnType
是List[String]
。