Отражая метод foo()
класса 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]
Однако, если мы определим класс 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
Почему эти фрагменты кода дают разные результаты?
Как мы можем отразить конкретный тип возврата метода foo()
, если Cls
определен во время выполнения с использованием набора инструментов?