1
我在Scala 2.10.0-M7中玩弄反射,偶然發現了ClassSymbol.isCaseClass
方法,它在scala控制檯中表現得像預期的那樣,但不是在作爲java應用程序或scala腳本執行。Scala 2.10反射:ClassSymbol.isCaseClass在scala控制檯中工作,但不在腳本/ app中
我定義TestScript.scala
這樣的:
import reflect.runtime.currentMirror
case class TestCase(foo: String)
object Test {
def main(args: Array[String]) {
val classSymbol = currentMirror.reflect(new TestCase("foo")).symbol
val isCaseClass = classSymbol.isCaseClass
println(s"isCaseClass: $isCaseClass")
}
}
Test.main(Array())
如果我執行它的命令行呼籲
$ scala TestScript.scala
我得到這樣的輸出:
isCaseClass: false
如果我不是將代碼輸入到交互式scala外殼中或像這樣加載:
scala> :load TestScript.scala
我得到以下正確的輸出:
Loading TestScript.scala...
import reflect.runtime.currentMirror
defined class TestCase
defined module Test
isCaseClass: true
如果我編譯它,執行它作爲一個標準的Java應用程序,我得到false
的結果爲ClassSymbol.isCase
一次。
我錯過了什麼? scala控制檯環境和java運行時環境有什麼區別?我怎樣才能在真正的應用程序中獲得正確的結果?
如果作爲java應用程序執行,它會起作用,但如果作爲scala腳本執行,則會出人意料。但是,因爲劇本只是爲了嘗試這個,所以對我來說不是什麼阻礙。關於您的編輯:當然,我不會使用里程碑來創建高效的應用程序;-)對於「真實」,我只是指在JVM上運行的已編譯的工件(例如jar)。 – sven