当前位置: 首页 > ds >正文

kotlin JvmName注解的作用和用途

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_annotaionfun 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,提高代码的可维护性和交互性。

http://www.xdnf.cn/news/4836.html

相关文章:

  • 【WebRTC-13】是在哪,什么时候,创建编解码器?
  • 驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)
  • 【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南
  • 初识Dockerfile之RUN和WORKDIR
  • 【MySQL】第二弹——MySQL表的增删改查(CURD))
  • [ctfshow web入门] web57
  • 2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用
  • springCloud/Alibaba常用中间件之GateWay网关
  • 大型语言模型在网络安全领域的应用综述
  • 【WEB3】区块链、隐私计算、AI和Web3.0——数据民主化(1)
  • Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析
  • RabbitMQ--基础篇
  • Android Studio 模拟器配置方案
  • 跨平台移动开发框架React Native和Flutter性能对比
  • 每周靶点分享:Angptl3、IgE、ADAM9及文献分享:抗体的多样性和特异性以及结构的新见解
  • 从代码学习深度学习 - 单发多框检测(SSD)PyTorch版
  • Comfyui 与 SDwebui
  • C++内存管理与模板初阶详解:从原理到实践
  • Java详解LeetCode 热题 100(13):LeetCode 53:最大子数组和(Maximum Subarray)详解
  • Android学习总结之算法篇八(二叉树和数组)
  • 10. CSS通配符与选择器权重深度解析:以《悯农》古诗为例
  • 比较Facebook与其他社交平台的隐私保护策略
  • RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理
  • 机器视觉的手机FPC油墨丝印应用
  • 在k8s中,如何实现服务的访问,k8s的ip是变化的,怎么保证能访问到我的服务
  • 数据结构-非线性结构-二叉树
  • G口大带宽服务器线路怎么选
  • 根据窗口大小自动调整页面缩放比例,并保持居中显示
  • Python程序,输入IP,扫描该IP哪些端口对外是开放的,输出端口列表
  • Vue生命周期脚手架工程Element-UI