JVM 语言互操作性

JVM language interoperability

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

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

我一直在努力思考 Scala 如何做到这一点的任何方法。这是我的想法。

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

研究 Scala,它与其他 JVM 语言一起工作得很好,但我找不到关于它究竟如何工作的信息。

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

我认为您混淆了 class 路径和源路径:class 路径上没有 .java.scala 文件,有 .class 文件(可能在 .jars 内)。所以对于依赖项(在 class 路径上),你不需要做任何特别的事情。它们可以对您的语言有自己的依赖性,包括您项目的先前版本,但它们已经按定义编译。

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

选项 3 的问题不在于 "the JVM doesn't allow for loading classes that are outside of the compilers class path",而是反射也只适用于 classes,不适用于源文件。