当前位置: 首页 > 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.xdnf.cn/news/337123.html

相关文章:

  • 《信息论与编码课程笔记》——信源编码(1)
  • 动态SQL与静态SQL
  • threejs 添加css3d标签 vue3
  • [数据处理] 6. 数据可视化
  • 商业中的人工智能 (AI) 是什么?
  • 从0到1:用Lask/Django框架搭建个人博客系统(4/10)
  • 每日学习:DAY24
  • 第三节第一部分:Static修饰类变量、成员变量
  • pip下载tmp不够
  • ASP.NET Core 中实现 Markdown 渲染中间件
  • 信创生态核心技术栈:数据库与中间件
  • 《智能网联汽车 自动驾驶功能场地试验方法及要求》 GB/T 41798-2022——解读
  • Mac 平台 字体Unicode范围分析器
  • 使用迁移学习的自动驾驶汽车信息物理系统安全策略
  • MySQL数据库创建、删除、修改
  • Android NDK版本迭代与FFmpeg交叉编译完全指南
  • ubuntu24.04安装anaconda
  • SwiftData 数据持久化解决方案
  • 如何使用极狐GitLab 软件包仓库功能托管 python?
  • git设置tabsize
  • Kubernetes client-go 客户端类型与初始化指南
  • 驱动开发硬核特训 · Day 30(上篇):深入理解 I2C 总线驱动模型(以 at24 EEPROM 为例)
  • Dynamic Causal Modeling在医疗AI领域的编程案例与应用研究
  • 〖 Linux 〗解决 VS Code 远程连接服务器的常见问题
  • iPhone手机连接WiFi异常解决方法
  • 【hadoop】案例:Sqoop迁移仓库数据
  • 5、开放式PLC梯形图编程组件 - /自动化与控制组件/open-plc-programming
  • Lua学习笔记
  • 无刷电机控制算法策略
  • AI驱动的制造工艺:系统化探索与创新