【发布时间】:2020-11-12 05:44:48
【问题描述】:
当反射Cls类的foo()方法时,我们可以很容易地使用下面的方法得到具体的返回类型。
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]
但是,如果我们在运行时通过工具箱定义类Cls,然后使用相同的方法反射过程,我们只会得到foo()方法的抽象返回类型(List)。
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
为什么这些代码sn-ps会产生不同的结果?
如果在运行时使用工具箱定义了Cls,我们如何反映foo()方法的具体返回类型?
【问题讨论】:
标签: scala reflection scala-reflect