为什么斯卡拉反射对象内,但不是在脚本的顶层工作?(Why does Scala reflection

2019-11-03 05:17发布

此脚本使用反射来找到一个构造函数的类型签名。 它包含一个对象中,并在顶层相同的代码:

// 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和从顶层调用它。

如果我通过运行在REPL文件中的顶级代码工作scala -i refltest.scala 。 这是可以预料的,因为REPL把一切都变成一个对象。 我不明白的是,为什么代码的对象内的存在会影响反射的结果吗?

Answer 1:

该脚本运行包在本地匿名类代码; 你的代码运行的初始化程序的一部分。

我不知道为什么,打破反映,但它是一个重复这个问题,从之前几年 。 已编辑说这个问题是固定的,但我没有看到它的工作。

作为一种变通方法,包你的代码块:

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

也许这与init命令,以及如何在本地类被编译的事情。



文章来源: Why does Scala reflection work inside an object but not at the top level of a script?