为什么Scala反射工作在对象内部,而不是在脚本的顶层



这个脚本使用反射来查找构造函数的类型签名。它在对象内部和顶层包含相同的代码:

// Scala 2.11.1
case class Dirigible(cubicFeet: Int)
object Object {
  val u = scala.reflect.runtime.universe
  val ctor = u.weakTypeOf[Dirigible].decl(u.termNames.CONSTRUCTOR).typeSignature
  def run() {
    println(ctor)
  }
}
Object.run()
val u = scala.reflect.runtime.universe
val ctor = u.weakTypeOf[Dirigible].decl(u.termNames.CONSTRUCTOR).typeSignature
println(ctor)

输出如下:

(cubicFeet: Int)$anon.this.Dirigible
<notype>

为什么顶级代码失败,而Object内部的代码工作?

如果我将println放在顶级def中并从顶级调用它,则会发生相同的失败。

顶层代码工作,如果我通过scala -i refltest.scala在REPL中运行文件。这是意料之中的,因为REPL将所有内容放入对象中。我不明白的是,为什么代码在对象内部会影响反射的结果?

脚本运行程序将代码封装在本地匿名类中;您的代码将作为初始化项的一部分运行。

我不知道为什么这打破了反思,但这是几年前这个问题的重复。这是编辑说问题已经解决,但我没有看到它工作。

作为一种解决方法,将代码包装在块中:

locally {
val u = scala.reflect.runtime.universe
val ctor = u.weakTypeOf[Dirigible].decl(u.termNames.CONSTRUCTOR).typeSignature
println(ctor)
}

可能与初始化顺序和如何编译本地类有关。

相关内容

  • 没有找到相关文章

最新更新