通过ToolBox定义的scala对象的ModuleMirror

时间:2014-01-22 03:34:43

标签: scala reflection scala-2.10

我试图通过向ToolBox提供一个字符串来定义Scala对象,但我找不到获取生成的ModuleMirror句柄的方法。我想它会像下面这样但我似乎无法从ToolBox eval的结果中获取RuntimeClass:

import scala.reflect.runtime._
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

val src = """ object MyObject { def hello() = "world" } """

val mirror = universe.runtimeMirror(getClass.getClassLoader)

val toolBox = mirror.mkToolBox()
val tree = toolBox.parse(src)
val value = toolBox.eval(tree)

// convert from result of eval to RuntimeClass...?
val runtimeClass: RuntimeClass = ???

val moduleSymbol = mirror.moduleSymbol(runtimeClass)

val moduleMirror = mirror.reflectModule(moduleSymbol.asModule)

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

获取对象类的最佳方法可能是从正在编译的代码块返回MyObject.getClass

但是,在结果类上调用moduleSymbol将导致NoSymbol,因为Scala反射当前不支持本地对象。为什么本地对象?因为eval在一个方法中包含了提供给它的代码以启用它的评估,这意味着MyObject最终将成为包装器方法的本地。为什么目前不支持?好吧,这是因为Scala反射依赖于带有Scala特定元数据的@ScalaSignature注释,并且这些注释当前没有保存用于本地定义。

我认为可以将ToolBox.compileeval的非评估对象)更改为顶级定义的特殊情况处理,这样它们就不会被编译为本地。您能否向我们的问题跟踪器提交问题,以便我们不要忘记修复它?