作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我一直在为 JVM 编程语言编写编译器,我意识到一个问题。
我想从我的编程语言访问 Java 方法,并允许 Java 方法访问我的语言中的方法。问题是我需要知道 Java 方法签名才能在我生成的字节码中调用它,反之亦然。
我一直在努力想出 Scala 如何做到这一点的任何方法。这是我的想法。
.java
文件并解析它们,从那里提取方法签名。 .java
文件被编译成.class
文件。然后使用 Java ASM 库访问 .class
文件并获取方法签名。此方法的问题是必须先编译 .java
文件。 .java
文件使用反射动态加载。这个问题是我相信 JVM 不允许加载编译器类路径之外的类。 研究 Scala,它与其他 JVM 语言一起工作得很好,但我找不到关于它究竟如何工作的信息。
Scala如何获取其他JVM语言方法的方法签名?
最佳答案
我认为你混淆了类路径和源路径:类路径上没有 .java
或 .scala
文件,有 .class
文件(可能在 .jar
中)。所以对于依赖项(在类路径上),你不需要做任何特别的事情。它们可以对您的语言有自己的依赖性,包括您项目的先前版本,但它们已经按定义编译。
现在,对于混合项目,源路径上有 Java 和您的语言,scalac does parse Java with its own parser (i.e. your option 1) .
选项 3 的问题不是“JVM 不允许加载编译器类路径之外的类”,而是反射也只适用于类,而不适用于源文件。
关于java - JVM 语言互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51306411/
我是一名优秀的程序员,十分优秀!