【问题标题】:Reflect Scala object from Java从 Java 反射 Scala 对象
【发布时间】: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 的这种特殊用法会给出错误的结果。

标签: java scala


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看这个关于 Scala 对象的 Java 等效实现的问题的答案,以了解 Scala 对象如何转换为 Java 概念

    What is the Java equivalent of a Scala object?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2012-11-13
      • 2012-03-18
      • 2023-01-25
      相关资源
      最近更新 更多