4

この質問に続いて、オブジェクトのメソッドを呼び出す方法を見つけようとしています。関連する定義は次のとおりです。

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)

問題は、このエラー メッセージが何をするように指示しているのか理解できないことです!

4

1 に答える 1

7

あなたは書く必要がありますruntimeMirror.reflect(<instance of MyClass>).reflectModule(objASymbol)objA一部のリフレクティブ操作(インスタンスの取得など)には外部インスタンスが必要なため、プレーンなreflectModuleは機能しません。

残念ながら、M4は静的オブジェクトのみをサポートしているため、正しく記述してもユースケースは機能しません:https ://issues.scala-lang.org/browse/SI-5498 。これは2.10.0-finalより前に実装します。

于 2012-06-18T15:29:55.800 に答える