1. @JvmName 注解的作用
@JvmName
是 Kotlin 提供的一个注解,用于在编译为 Java 字节码时自定义生成的类名或方法名。
作用对象:
- 文件级别(整个
.kt
文件) - 函数、属性、类等成员
- 文件级别(整个
主要用途:
- 控制 Kotlin 编译后生成的 JVM 类名和方法名。
- 避免与 Java 的命名冲突。
- 提高 Java 调用 Kotlin 代码时的可读性和一致性。
2. 使用场景
✅ 场景 1:修改 Kotlin 文件对应的 JVM 类名
Kotlin 默认会将文件 FileName.kt
编译成 FileNameKt.class
。
使用 @file:JvmName("CustomName")
可以指定生成的类名为 CustomName.class
。
@file:JvmName("Stu")
package com.mayh.kotlindemo.kt_step7.kt_annotaion
fun getStudentInfo(name: String) {
println(name)
}
编译后生成的类名为:
Stu.class
✅ 场景 2:修改 Kotlin 函数在 JVM 中的方法名
可以给某个函数添加 @JvmName("customMethodName")
,使其在 Java 中调用时使用指定名称。
@JvmName("getSt")
fun getStudentInfo(studentName: String) = println(studentName)
编译后生成的方法名为:
public static final void getSt(String studentName)
✅ 场景 3:解决 Java 调用多个同名 Kotlin 文件函数冲突
当多个 Kotlin 文件包含相同包名下的同名顶层函数时,Java 调用可能会冲突。
通过 @file:JvmName
修改生成的类名即可避免冲突。
✅ 场景 4:与 @JvmOverloads
或 @JvmField
等配合使用
在混编项目中,结合其他 JVM 相关注解,统一 Kotlin 和 Java 的接口风格。
3. 注意事项
注意点 | 说明 |
---|---|
不能重载 by name only | 如果两个函数仅通过 @JvmName 改变名字导致签名相同,会编译报错。 |
避免与 Java 关键字冲突 | 如命名成 Int , String 等会导致错误。 |
对扩展函数也有效 | 可以为扩展函数指定 JVM 名称,便于 Java 调用。 |
4. 总结
功能 | 描述 |
---|---|
@JvmName on file | 指定整个 Kotlin 文件编译后的类名 |
@JvmName on function/property | 指定该方法/属性在 JVM 中的名称 |
适用场景 | Java/Kotlin 混合项目、避免命名冲突、提升可读性 |
推荐使用方式 | 在需要被 Java 调用的工具类、顶层函数中使用 |
在 Android 开发或 Java/Kotlin 混合项目中,合理使用
@JvmName
可以让 Kotlin 更好地兼容 Java,提高代码的可维护性和交互性。