我scalap
用来读出一些案例类的字段名称(如本问题所述)。案例类和scalap
用于分析它们的代码都已编译并放入类路径上的 jar 文件中。
现在我想运行一个使用此代码的脚本,所以我按照说明操作并想出了类似的东西
::#!
@echo off
call scala -classpath *;./libs/* %0 %*
goto :eof
::!#
//Code relying on pre-compiled code that uses scalap
这不起作用:
java.lang.ClassCastException: scala.None$ 不能在 scala.tools.nsc.interpreter.ByteCode$.caseParamNamesForPath(ByteCode.scala:45) 在 scala.tools.nsc.interpreter.ProductCompletion.caseNames( ProductCompletion.scala:22)
但是,当我编译所有内容时,代码工作得很好。我尝试了其他scala
选项,例如-savecompiled
,但这没有帮助。这是一个错误,还是原则上不能工作?(如果是这样,有人可以解释为什么不这样做吗?正如我所说,要分析的案例类scalap
是编译的。)
注意:我使用 Scala 2.9.1-1。
编辑
这是我本质上想要做的(提供一种创建案例类的多个实例的简单方法):
//This is pre-compiled:
import scala.tools.nsc.interpreter.ProductCompletion
//...
trait MyFactoryTrait[T <: MyFactoryTrait[T] with Product] {
this: T =>
private[this] val copyMethod = this.getClass.getMethods.find(x => x.getName == "copy").get
lazy val productCompletion = new ProductCompletion(this)
/** The names of all specified fields. */
lazy val fieldNames = productCompletion.caseNames //<- provokes the exception (see above)
def createSeq(...):Seq[T] = {
val x = fieldNames map { ... } // <- this method uses the fieldNames value
//[...] invoke copyMethod to create instances
}
// ...
}
//This is pre-compiled too:
case class MyCaseClass(x: Int = 0, y: Int = 0) extends MyFactoryTrait[MyCaseClass]
//This should be interpreted (but crashes):
val seq = MyCaseClass().createSeq(...)
注意:我继续使用 Scala 2.9.2,错误保持不变(所以可能不是错误)。