これには、既存の Java ライブラリと新しい Scala コードの間の相互運用のアイデアにまつわる多くの使用例があります。私が選択したユースケースは、私が考える最も簡単なものです。
使用事例:
私はいくつかの scala テスト用に JUnit ランナーを提供することに取り組んでいます (Eclipse で素敵な赤/緑のバーを取得できるようにするため) ランナーには、パラメーターとして Java クラスを持つコンストラクターが必要です。したがって、Scala では次のことができます。
class MyRunner(val clazz: Class[Any]) extends Runner {
def getDescription(): Description
def run(notifier: RunNotifier)
}
どちらかを使うと
@RunWith(MyRunner)
object MyTestObject
また
@RunWith(MyRunner)
class MyTestClass
その後、ランナーは実際に正しくインスタンス化され、適切なクラス オブジェクトが渡されます
残念ながら、私が今やりたいことは、オブジェクト MyTestObject を「取得」するか、MyTestClass を作成することです。これらは両方とも Scala エンティティです。Scala Reflection を使用したいのですが、標準の Junit jar も使用したいと考えています。
私がやった事
次の Stackover フローの質問は参考になりましたが、同じ問題ではありませんでした。私が見つけることができる最も近い質問がありました
- TypeTag を手動で作成するには?
- Scala (2.10) タイプのタグまたはシンボルから Java クラスを取得する方法はありますか?
- Java リフレクションで Scala リフレクションを使用する
http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.htmlの Environments、Universes、Mirrors に関する議論は良かったし、他の scala リフレクションに関する同様のドキュメントも役に立ちました。ほとんどの場合、Scala リフレクションについてです。
私は Scaladocs をブラウズしましたが、Scala リフレクションに関する私の知識は (まだ) それらから欲しいものを得るには十分ではありませんでした。
編集:ここで尋ねられたのは、リフレクションによって作成されているクラスのコードです
@RunWith(classOf[MyRunner])
object Hello2 extends App {
println("starting")
val x= "xxx"
}
したがって、興味深いのは、MODULE$ というフィールドを使用して以下に提案されているソリューションは何も出力せず、x の値が null であることです。