Ho implementato il codice menzionato in Get companion object instance with new Scala reflection API (codice da qui https://gist.github.com/xeno-by/4985929).Ottieni l'istanza dell'oggetto companion di un modulo interno con l'API di riflesso di Scala
Questo funziona perfettamente per qualsiasi classe di classi di casi standard. Purtroppo in alcune classi del progetto ottengo un'eccezione: scala.ScalaReflectionException: object Tensor is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror
L'eccezione è abbastanza chiaro, così ho cercato di cambiare il mio codice come segue:
object Reflection {
def getCompanionObject(caseclassinstance:Product):Any = {
import scala.reflect.runtime.{currentMirror => cm}
val classSymbol = cm.classSymbol(caseclassinstance.getClass)
val moduleSymbol = classSymbol.companionSymbol.asModule
val instanceMirror = cm.reflect(caseclassinstance)
val moduleMirror = instanceMirror.reflectModule(moduleSymbol)
moduleMirror.instance
}
}
Ma ora ho un scala.ScalaReflectionException: expected a member of class Tensor, you provided object Prototype2.SPL.SPL_Exp.Tensor
e non ho trovato il modo di cambia il codice per risolvere questo problema. Qualsiasi aiuto è molto apprezzato!
Aggiornamento: Ho fornire qualche codice per una migliore riproducibilità:
scala> trait SPL {
| case class Tensor()
| }
defined trait SPL
scala> val s = new SPL {}
s: SPL = [email protected]
scala> val t = s.Tensor()
t: s.Tensor = Tensor()
scala> object Reflection { /* as in the first code snippet*/}
defined module Reflection
scala> Reflection.getCompanionObject(t)
scala.ScalaReflectionException: object Tensor is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror
...
scala> object Reflection { /* as in the second code snippet*/}
defined module Reflection
scala> Reflection.getCompanionObject(t)
scala.ScalaReflectionException: expected a member of class Tensor, you provided object SPL.Tensor
...
Questa domanda http://stackoverflow.com/questions/11084408/scala-reflection-error-this-is-an-inner-module-use-reflectmodule-on-an-instanc potrebbe essere correlato – leo