【发布时间】:2017-04-05 02:33:42
【问题描述】:
是否可以使用反射从 Java 中获取对 Scala Object 类的引用?
为了说明我的意思,这是执行此操作的 Scala 代码(假设 MyClass 是一个 Scala 对象):
val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
val module = runtimeMirror.staticModule("MyClass")
val obj = runtimeMirror.reflectModule(module)
val realObject: MyInterface = obj.instance.asInstanceOf[MyInterface]
在 Java 中,我成功加载了类,但我似乎无法获得对该对象的实际引用;在类上调用 newInstance() 显然会失败,因为它没有公共构造函数。
我已经设法通过反射获取它的构造函数并将其设置为可访问来解决它,但这对我来说似乎是一个 hack.. 是否有 BKM 可以做这种事情?
【问题讨论】:
-
很多反射代码可以做到这一点...
setAcessible(true)就是这样。您已经在使用 reflection,这已经是一种 hack -
Scala 的对象编译成 2 个
.class文件,一个只包含实现的静态转发器(单例),称为$MODULE,另一个是带有$的内部类。请参阅此答案stackoverflow.com/a/12785219/4496364。我猜你想要MODULE$实例... -
@Eugene 但是,
setAccessible的这种特殊用法会给出错误的结果。