この質問に続いて、オブジェクトのメソッドを呼び出す方法を見つけようとしています。関連する定義は次のとおりです。
trait ThirdParty { def invoke = println("right") }
trait WeatherIcon { def invoke = println("wrong") }
class MyClass {
object objA extends ThirdParty
object objB extends WeatherIcon
}
私はこのようなものSymbol
を手に入れましたobjA
:
import reflect.runtime.universe._
val stuff = typeOf[MyClass].members.filter(_.isValue).filter(_.typeSignature <:< typeOf[ThirdParty])
それは単一の要素を持つ を返すIterable
ので、次のようにしましょう:
val objASymbol = stuff.head.asModuleSymbol
次に、この他の質問に基づいて、これを試しました:
val mirror = runtimeMirror(getClass.getClassLoader)
mirror.reflectModule(objASymbol)
その結果、件名で引用されたエラーメッセージが表示されました:
java.lang.Error: this is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror
at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:118)
at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:60)
問題は、このエラー メッセージが何をするように指示しているのか理解できないことです!