Kotlin 中的顶层方法(Top-level functions)在 class 文件中是如何实现的?
Java 中的方法不能脱离类而独立存在,但同样可以运行在 JVM 上的 kotlin 却支持顶层方法(Top-level functions),那么顶层方法在 class 文件中是如何实现的呢?
结论
- 在
XXX.kt中定义的顶层方法f(),在class文件中会转化为XXXKt类中的静态方法f()。 - 可以通过
@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 的内容。
对比后会发现, A.kt 中的 add(Int, Int) 方法转化成了 AKt 这个类中的静态方法: add(int, int)。
据此可以推测,在 XXX.kt 中定义的顶层方法 f(),在 class 文件中会转化为 XXXKt 类中的静态方法 f()。
JvmName 一文 提到以下内容 ⬇️
可见对应的 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/ 网站上关于以下内容的介绍