微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。