Kotlin 如何自动为 JVM 生成绑定?
How does Kotlin generates bindings for the JVM automatically?
我对语言互操作的主题很感兴趣。
对于 Kotlin/JVM 目标,我们可以直接调用 Java 代码,而无需定义任何绑定接口或使用 SWIG library、JNI 等工具。这是如何实现的?
简短回答:Java 运行时处理所有;不需要绑定。
JVM runs (except for native calls using JNI or similar) are provided to it as Java bytecode的所有classes和接口(通常以.class文件的形式);无论字节码是从 Java、Kotlin、Groovy、Scala 还是任何其他 JVM 语言编译而来,都是一样的。
字节码包含 class 或接口的所有构造函数、字段和方法的详细信息。当它引用其他 classes 时,它通过它们的完全限定名称(例如 java.lang.String
)来实现——并且 JVM 知道如何找到(例如通过搜索 class 路径)和加载任何 class 给定的完全限定名称。 (具体来说,它使用 ClassLoader — usually the system 一个,尽管可以在适当的地方使用自定义的。)加载 class 后,可以构造实例并直接调用它们的方法。
因此 JVM 不需要任何辅助手段来识别或访问 classes/interfaces 或其方法;都在字节码中指定并可直接访问。
(如果您需要更多详细信息,Java Virtual Machine Specification 可能是最终参考。)
我对语言互操作的主题很感兴趣。
对于 Kotlin/JVM 目标,我们可以直接调用 Java 代码,而无需定义任何绑定接口或使用 SWIG library、JNI 等工具。这是如何实现的?
简短回答:Java 运行时处理所有;不需要绑定。
JVM runs (except for native calls using JNI or similar) are provided to it as Java bytecode的所有classes和接口(通常以.class文件的形式);无论字节码是从 Java、Kotlin、Groovy、Scala 还是任何其他 JVM 语言编译而来,都是一样的。
字节码包含 class 或接口的所有构造函数、字段和方法的详细信息。当它引用其他 classes 时,它通过它们的完全限定名称(例如 java.lang.String
)来实现——并且 JVM 知道如何找到(例如通过搜索 class 路径)和加载任何 class 给定的完全限定名称。 (具体来说,它使用 ClassLoader — usually the system 一个,尽管可以在适当的地方使用自定义的。)加载 class 后,可以构造实例并直接调用它们的方法。
因此 JVM 不需要任何辅助手段来识别或访问 classes/interfaces 或其方法;都在字节码中指定并可直接访问。
(如果您需要更多详细信息,Java Virtual Machine Specification 可能是最终参考。)