是否可以使用反射从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中,我成功加载了Class,但我似乎无法获得对象的实际引用;在类上调用newInstance()显然会失败,因为它没有公共构造函数。
我设法通过反射获取构造函数并将其设置为可访问来解决它,但这对我来说似乎是一个黑客攻击......是否有BKM用于执行此类操作?
答案 0 :(得分:0)
请参阅此问题的答案,了解Scala对象的Java等效实现,以了解Scala对象如何转换为Java概念
答案 1 :(得分:0)
insan-e提到MODULE $的评论就是这个伎俩。
下面的代码现在按预期工作(从外部jar文件加载类):
String className = "MyClass";
File f = new File("C:\\TEMP\\source.jar");
URLClassLoader urlCl = new URLClassLoader(new URL[]{f.toURI().toURL()}, getClass().getClassLoader());
Class c = urlCl.loadClass(className);
Field module = c.getField("MODULE$");
if (module.get(this) instanceof MyInterface)
{
MyInterface obj = (MyInterface) module.get(this);
}