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

kotlin @JvmStatic注解的作用和使用场景

1. @JvmStatic 的作用

@JvmStatic 是 Kotlin 提供的一个注解,用于在 JVM 上将伴生对象(companion object)中的方法或属性暴露为 Java 静态方法或字段

  • 作用对象:只能用在 companion object 中的函数或属性。
  • 效果
    • 在 Java 中可以直接通过类名调用该方法,而不需要先创建实例。
    • 编译后生成 public static final 方法或字段。

2. 使用场景

✅ 场景 1:Java 调用 Kotlin 工具方法

当 Kotlin 中定义了一些工具类的静态方法,Java 代码希望像调用普通静态方法一样使用它们。

class StringUtils {companion object {@JvmStaticfun isEmpty(str: String?): Boolean {return str == null || str.isEmpty()}}
}

Java 中调用方式:

boolean empty = StringUtils.isEmpty("hello");

如果不加 @JvmStatic,Java 必须这样调用:

boolean empty = StringUtils.Companion.isEmpty("hello");

✅ 场景 2:实现单例模式并提供 Java 静态访问方式

结合 @JvmStaticobject 声明,可以更自然地在 Java 中访问 Kotlin 单例。

object Logger {@JvmStaticfun log(message: String) {println("Log: $message")}
}

Java 调用:

Logger.log("This is a message");

✅ 场景 3:与 Android Framework 兼容

Android 框架中很多 API 依赖 Java 静态方法,如 ActivityServiceBroadcastReceiver 等组件中调用工具类时,使用 @JvmStatic 可以提升兼容性和可读性。


3. 注意事项

注意点说明
仅适用于 companion object 成员不可用于普通对象或类成员
不能重载 by name only如果两个方法签名相同,仅靠 @JvmName@JvmStatic 会编译失败
@JvmName 可组合使用可同时修改方法名和生成静态方法

4. 对比不加 @JvmStatic

使用方式是否需要 .Companion 访ixJava 调用是否简洁
@JvmStatic❌ 不需要✅ 简洁
@JvmStatic✅ 需要 ClassName.Companion.method()❌ 不友好

5. 总结

功能描述
作用将 Kotlin companion object 中的方法/属性标记为 Java 静态方法
适用场景Java/Kotlin 混合项目、工具类、单例、Android 开发
推荐使用方式在需要被 Java 调用的公共方法上添加

在 Kotlin 与 Java 混合开发中,合理使用 @JvmStatic 可显著提升互操作性,使 Kotlin 更贴近 Java 的调用习惯。

http://www.dtcms.com/a/177707.html

相关文章:

  • 趣味编程:爱心
  • QMK开发环境搭建指南:Eclipse和VS Code详解
  • VGGNet详解
  • 裸辞8年前端的面试笔记——JavaScript篇(一)
  • 深入理解 Docker 网络原理:构建高效、灵活的容器网络
  • 在Lua中使用轻量级userdata在C/C++之间传递数据和调用函数
  • MySQL中MVCC的实现原理
  • 【MySQL】存储引擎 - InnoDB详解
  • 区块链内容创作全攻略:海报、白皮书与视频的视觉化革命
  • commonmark.js 源码阅读(一) - Block Parser
  • 【Linux】FreeRTOS与Linux:实时与通用的终极对比
  • DApp开发:开启去中心化应用新时代
  • Solidity语言基础:区块链智能合约开发入门指南
  • Windows Server 2025 安装AMD显卡驱动
  • C++内存管理与模板初阶详解:从原理到实践
  • Webug4.0靶场通关笔记22- 第27关文件包含
  • systemd vs crontab:Linux 自动化运行系统的全面对比
  • 架空输电线巡检机器人轨迹优化设计
  • 阿里云ddos云防护服务器有哪些功能?ddos防御手段有哪些??
  • C++入门(下)--《Hello C++ World!》(2)(C/C++)
  • 金仓数据库征文-金仓KES数据同步优化实践:逻辑解码与增量同步
  • 深度 |提“智”向新,奔向未来——当前机器人产业观察
  • 实时操作系统:航空电子系统的安全基石还是创新枷锁?
  • Vue事件总线(EventBus)使用指南:详细解析与实战应用 父子组件传值
  • 计算机体系架构-----设计模式:状态模式(从程序员加班问题切入)
  • 顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
  • GoWeb开发
  • R1-Searcher:用强化学习解锁大语言模型检索新能力!
  • 【ArcGIS技巧】用地块生成界址点去重、顺时针编号挂接DKBM属性
  • [python] 函数基础