7

新しい Scala リフレクション API を使用してコンパニオン オブジェクト インスタンスを取得するに記載されているコードを実装しました( https://gist.github.com/xeno-by/4985929のコード)。

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 moduleMirror = cm.reflectModule(moduleSymbol)
        moduleMirror.instance
    }
}

これは、ケース クラスのすべての標準クラスで問題なく機能します。残念ながら、プロジェクトの一部のクラスで例外が発生しますscala.ScalaReflectionException: object Tensor is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror。例外はかなり明確であるため、次のようにコードを変更しようとしました。

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
    }
}

しかし、今は、scala.ScalaReflectionException: expected a member of class Tensor, you provided object Prototype2.SPL.SPL_Exp.Tensorこれを修正するためにコードを変更する方法がわかりませんでした。どんな助けでも大歓迎です!

更新:再現性を高めるためにいくつかのコードを提供します:

scala> trait SPL {
     | case class Tensor()
     | }
defined trait SPL

scala> val s = new SPL {}
s: SPL = $anon$1@165f5a4

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
...
4

1 に答える 1