这个脚本使用反射来查找构造函数的类型签名。它在对象内部和顶层包含相同的代码:
// 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)
}
可能与初始化顺序和如何编译本地类有关。