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 靜態訪問方式
結合 @JvmStatic
和 object
聲明,可以更自然地在 Java 中訪問 Kotlin 單例。
object Logger {@JvmStaticfun log(message: String) {println("Log: $message")}
}
Java 調用:
Logger.log("This is a message");
? 場景 3:與 Android Framework 兼容
Android 框架中很多 API 依賴 Java 靜態方法,如 Activity
、Service
、BroadcastReceiver
等組件中調用工具類時,使用 @JvmStatic
可以提升兼容性和可讀性。
3. 注意事項
注意點 | 說明 |
---|---|
僅適用于 companion object 成員 | 不可用于普通對象或類成員 |
不能重載 by name only | 如果兩個方法簽名相同,僅靠 @JvmName 或 @JvmStatic 會編譯失敗 |
與 @JvmName 可組合使用 | 可同時修改方法名和生成靜態方法 |
4. 對比不加 @JvmStatic
使用方式 | 是否需要 .Companion 訪ix | Java 調用是否簡潔 |
---|---|---|
有 @JvmStatic | ? 不需要 | ? 簡潔 |
無 @JvmStatic | ? 需要 ClassName.Companion.method() | ? 不友好 |
5. 總結
功能 | 描述 |
---|---|
作用 | 將 Kotlin companion object 中的方法/屬性標記為 Java 靜態方法 |
適用場景 | Java/Kotlin 混合項目、工具類、單例、Android 開發 |
推薦使用方式 | 在需要被 Java 調用的公共方法上添加 |
在 Kotlin 與 Java 混合開發中,合理使用
@JvmStatic
可顯著提升互操作性,使 Kotlin 更貼近 Java 的調用習慣。