Je joue avec la réflexion dans Scala 2.10.0-M7 et trébuché sur la méthode ClassSymbol.isCaseClass
qui se comporte comme prévu dans la console scala mais pas quand exécuté en tant qu'application java ou en tant que script scala.Scala 2.10 réflexion: ClassSymbol.isCaseClass fonctionne dans la console scala mais pas dans le script/application
J'ai défini TestScript.scala
comme ceci:
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())
Si je l'exécute sur la ligne de commande appelant
$ scala TestScript.scala
Je reçois cette sortie:
isCaseClass: false
Si je place entrez le code dans le shell de scala interactif ou chargez-le comme ceci:
scala> :load TestScript.scala
-je obtenir la sortie correcte suivante:
Loading TestScript.scala...
import reflect.runtime.currentMirror
defined class TestCase
defined module Test
isCaseClass: true
Si je le compiler et l'exécuter comme une application Java standard que je reçois false
comme résultat pour ClassSymbol.isCase
à nouveau.
Qu'est-ce qui me manque? Quelles sont les différences entre l'environnement de la console scala et l'environnement d'exécution java? Comment puis-je obtenir le bon résultat dans une application réelle?
Cela fonctionne si elle est exécutée en tant qu'application java, mais étonnamment pas si elle est exécutée en tant que script scala. Mais comme le script était seulement pour essayer, ce n'est pas un bloqueur pour moi. En ce qui concerne votre montage: bien sûr, je n'utilise pas de jalon pour une application productive ;-) Avec "real", je voulais seulement dire qu'un artefact compilé (par exemple jar) fonctionnait sur la JVM. – sven