Kotlin 并非孤立存在:为何以及如何与其他语言协作
\n\n想象一下:您正在使用 Kotlin 编写代码——一种现代、简洁且安全的语言。但您的项目并非从零开始。在系统的某个角落,存在着基于 Java 的遗留代码,分析人员需要 Python 库,而底层操作则需要 C 语言。或者,您希望在前端复用用 Kotlin 编写的业务逻辑,但那里却是 JavaScript 的天下。
\n\n好消息是:Kotlin 与其他语言的集成 并非痛苦,而是一种超能力。Kotlin 被设计成一种“胶水语言”。它可以在 JVM 上运行(与 Java 并肩),可以编译成本地代码(Kotlin/Native),甚至可以编译成 JavaScript(Kotlin/JS)。
\n\n在本文中,我们将通过实际示例,剖析 Kotlin 与其他语言交互 的四个关键场景。您将了解如何从 Kotlin 调用 Python、如何通过 JNI 嵌入 C 代码、如何与 Java 无缝协作,甚至如何在前端使用 Kotlin。让我们开始吧!
\n\n1. Kotlin 和 Java:从第一行代码就血脉相连
\n\n最显而易见且最简单的场景是 Kotlin Java 互操作。由于 Kotlin 编译为 JVM 字节码,它与 Java 100% 兼容。您可以从 Kotlin 调用任何 Java 代码,反之亦然——无需桥梁、适配器,也无需痛苦。
\n\n如何从 Kotlin 调用 Java
\n假设您有一个用于处理日期的旧 Java 类:
\n\n// Java: DateUtils.java\npublic class DateUtils {\n public static String formatDate(long timestamp) {\n return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date(timestamp));\n }\n}\n\n\n在 Kotlin 中,您可以像使用原生类一样使用它:
\n\n// Kotlin\nfun main() {\n val formatted = DateUtils.formatDate(System.currentTimeMillis())\n println("今天: $formatted") // 今天: 2025-04-03\n}\n\n\n一切“开箱即用”。但有一个注意事项:null 安全性。Java 不了解 Kotlin 的可空类型,因此在调用 Java 方法时,Kotlin 会将返回值视为 平台类型(例如 String!)。建议:始终显式指定类型,或明智地使用 !! / ?.。
如何从 Java 调用 Kotlin
\n反向兼容性同样存在。假设您有一个 Kotlin 文件:
\n\n// Kotlin: Calculator.kt\npackage utils\n\nobject Calculator {\n @JvmStatic\n fun sum(a: Int, b: Int): Int = a + b\n}\n\n\n从 Java 中这样调用:
\n\n// Java\nimport utils.Calculator;\n\npublic class Main {\n public static void main(String[] args) {\n int result = Calculator.sum(5, 3);\n System.out.println(result); // 8\n }\n}\n\n\n关键是不要忘记为静态方法添加 @JvmStatic 注解,以及使用 @JvmName 来解决名称冲突。Kotlin 与 Java 的集成 如此紧密,以至于您可以在同一个项目中混合使用这两种语言——这是 Android 开发和许多基于 Spring 的后端项目的标准做法。
2. Kotlin 和 Python:两个世界,同一个 JVM(以及 GraalVM)
\n\n这就更有趣了。Kotlin Python 并非最平凡的组合,但它是可行的。虽然没有直接的本地桥梁,但我们可以使用基于 JVM 的解决方案。
\n\n方案 A:GraalVM——在 JVM 上运行 Python
\nGraalVM 是一种虚拟机,能够在同一个进程中运行多种语言(Java、Kotlin、JavaScript、Python、Ruby)。这是 Kotlin 与 Python 集成 的理想工具。
\n\n安装 GraalVM 并添加 Python 支持:
\n\ngu install python\n\n\n现在,可以在 Kotlin 代码中调用 Python 函数:
\n\n// Kotlin (GraalVM Polyglot API)\nimport org.graalvm.polyglot.*\n\nfun main() {\n val context = Context.create("python")\n // 执行