从Java反映Scala对象

时间:2017-04-04 14:04:29

标签: java scala

是否可以使用反射从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用于执行此类操作?

2 个答案:

答案 0 :(得分:0)

请参阅此问题的答案,了解Scala对象的Java等效实现,以了解Scala对象如何转换为Java概念

What is the Java equivalent of a Scala object?

答案 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);
}