Kotlin 中的顶层方法(Top-level functions)在 class 文件中是如何实现的?

67 阅读1分钟

Kotlin 中的顶层方法(Top-level functions)在 class 文件中是如何实现的?

Java 中的方法不能脱离类而独立存在,但同样可以运行在 JVM 上的 kotlin 却支持顶层方法(Top-level functions),那么顶层方法在 class 文件中是如何实现的呢?

结论

  1. XXX.kt 中定义的顶层方法 f(),在 class 文件中会转化为 XXXKt 类中的静态方法 f()
  2. 可以通过 @JvmName 注解来指定对应的类的名称。

代码

我们用一段简单的代码来探索一下,请将以下代码保存为 A.kt

fun add(a: Int, b: Int): Int {
  return a + b
}

kotlinc A.kt 命令编译 A.kt 后,会生成 AKt.class 文件(注意:AKt 中的 K大写的)。 在 Intellij IDEA 中可以用 Show Kotlin Bytecode 的功能来查看 AKt.class 的内容。

image.png

对比后会发现, A.kt 中的 add(Int, Int) 方法转化成了 AKt 这个类中的静态方法: add(int, int)。 据此可以推测,在 XXX.kt 中定义的顶层方法 f(),在 class 文件中会转化为 XXXKt 类中的静态方法 f()

JvmName 一文 提到以下内容 ⬇️

image.png

可见对应的 class 是可以调整的。 我们用修改后的 A.kt 来试试。(修改后的 A.kt 在下方)

@file:JvmName("IntAdder")
fun add(a: Int, b: Int): Int {
  return a + b
}

执行 kotlinc A.kt 命令后,会生成 IntAdder.class 文件。可见对应的 class 的确可以调整。

参考资料

kotlinlang.org/ 网站上关于以下内容的介绍

  1. functions
  2. JvmName