如何使用Scala工具箱在运行时定义的类的方法反映具体的返回类型?

问题描述

在反映类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.returnTypeList[String]