JVM语言互操作性

时间:2018-07-12 13:02:08

标签: java scala compiler-construction programming-languages java-bytecode-asm

最近,我一直在为JVM编程语言编写编译器,但我已经意识到了一个问题。

我想从我的编程语言访问Java方法,并且还希望Java方法可以以我的语言访问方法。问题是我需要知道Java方法签名才能在生成的字节码中调用它,反之亦然。

我一直在尝试考虑Scala如何做到这一点的任何方法。这是我的想法。

  1. Scala访问类路径上的.java文件并解析它们,然后从那里提取方法签名。
  2. .java文件被编译为.class文件。然后,使用Java ASM库访问.class文件并获取方法签名。此方法的问题在于必须首先编译.java文件。
  3. .java文件是使用反射动态加载的。问题是我相信JVM不允许加载编译器类路径之外的类。

研究Scala可以与其他JVM语言一起很好地工作,但是我找不到确切的信息来实现它。

Scala如何获取其他JVM语言方法的方法签名?

1 个答案:

答案 0 :(得分:5)

我认为您在混淆类路径和源路径:类路径上没有payment_method_view.java文件,有.scala个文件(可能在.class内部s)。因此,对于依赖关系(在类路径上),您不需要执行任何特殊操作。它们可以对您的语言有自己的依赖性,包括项目的早期版本,但是它们已经按照定义进行了编译。

现在,对于混合项目,您在源路径上有Java和语言 scalac does parse Java with its own parser (i.e. your option 1)

选项3的问题不在于“ JVM不允许加载编译器类路径之外的类”,而是反映也仅适用于类,而不适用于源文件。