我有很多用例,围绕着现有 Java 库和新 Scala 代码之间的互操作的想法。我选择的用例是我认为最简单的。
用例:
我正在为一些 scala 测试提供一个 JUnit Runner(这样我就可以在 Eclipse 中获得我可爱的红色/绿色条) runner 需要一个带有 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 流程问题具有教育意义,但不是同一个问题。我能找到最近的问题
http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html中关于环境、宇宙和镜像的讨论很好,关于其他 scala 反射的类似文档也有帮助。通过它主要是关于 Scala 反射。
我浏览了 Scaladocs,但我对 Scala 反射的了解还不足以让我从它们那里得到我想要的东西。
编辑:这里问的是反射创建的类的代码
@RunWith(classOf[MyRunner])
object Hello2 extends App {
println("starting")
val x= "xxx"
}
所以有趣的是,下面使用名为 MODULE$ 的字段提出的解决方案不打印任何内容,并且 x 的值为 null