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.pswp.cn/bicheng/80941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80941.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis實現-優惠卷秒殺(基礎版本)

(一)全局唯一ID 一、全局ID生成器 可以看到在優惠卷訂單表中的主鍵id并沒有設置Auto increment自增長 假如未來訂單量達到數億單,單表無法保存如此多數據,就需要對其進行分表存儲(分布式)。假如每張表都采用自增長,各自從1開始自增&#xf…

c++STL——哈希表封裝:實現高效unordered_map與unordered_set

文章目錄 用哈希表封裝unordered_map和unordered_set改進底層框架迭代器實現實現思路迭代器框架迭代器重載operator哈希表中獲取迭代器位置 哈希表的默認成員函數修改后的哈希表的代碼封裝至上層容器 用哈希表封裝unordered_map和unordered_set 在前面我們已經學過如何實現哈希…

虹科應用 | 探索PCAN卡與醫療機器人的革命性結合

隨著醫療技術的不斷進步,醫療機器人在提高手術精度、減少感染風險以及提升患者護理質量方面發揮著越來越重要的作用。醫療機器人的精確操作依賴于穩定且高效的數據通信系統,虹科提供的PCAN四通道mini PCIe轉CAN FD卡,正是為了滿足這一需求而設…

Yolov8的詳解與實戰-深度學習目標檢測

Yolov8的詳解與實戰- 文章目錄 摘要 模型詳解 C2F模塊 Loss head部分 模型實戰 訓練COCO數據集 下載數據集 COCO轉yolo格式數據集(適用V4,V5,V6,V7,V8) 配置yolov8環境 訓練 測試 訓練自定義數據集 Labelme…

scons user 3.1.2

前言 感謝您抽出時間閱讀有關 SCons 的內容。SCons 是一款下一代軟件構建工具,或者稱為 make 工具,即一種用于構建軟件(或其他文件)并在底層輸入文件發生更改時使已構建的軟件保持最新狀態的軟件實用程序。 SCons 最顯著的特點是…

Java的多線程筆記

創建一個線程的方法有多種,比如可以繼承Thread類或者實現Runnable接口,結論是實現Runnable接口比前者更加優越。 二者代碼對比 Java 不支持多繼承,如果你繼承了 Thread 類,就不能再繼承其他類,實現 Runnable 接口后&am…

PDF Base64格式字符串轉換為PDF文件臨時文件

需求描述: 在對接電子病歷系統與河北CA,進行免密文件簽章的時候,兩者系統入參不同,前者是pdf文件,base64格式;后者要求File類型的PDF文件。 在業務中間層開發時,則需要接收EMR側提供的base64格式…

代碼隨想錄訓練營第二十三天| 572.另一顆樹的子樹 104.二叉樹的最大深度 559.N叉樹的最大深度 111.二叉樹的最小深度

572.另一顆樹的子樹: 狀態:已做出 思路: 這道題目當時第一時間不是想到利用100.相同的樹思路來解決,而是先想到了使用kmp,不過這個題目官方題解確實是有kmp解法的,我使用的暴力解法,kmp的大致思…

【RabbitMq C++】消息隊列組件

RabbitMq 消息隊列組件 1. RabbitMq介紹2. 安裝RabbitMQ3. 安裝 RabbitMQ 的 C客戶端庫4. AMQP-CPP 庫的簡單使用4.1 使用4.1.1 TCP 模式4.1.2 擴展模式 4.2 常用類與接口介紹4.2.1 Channel4.3.2 ev 5. RabbitMQ樣例編寫5.1 發布消息5.2 訂閱消息 1. RabbitMq介紹 RabbitMq - …

鴻蒙NEXT開發動畫案例8

1.創建空白項目 2.Page文件夾下面新建Spin.ets文件,代碼如下: /*** SpinKit動畫組件 (重構版)* author: CSDN-鴻蒙布道師* since: 2025/05/14*/interface AnimationGroup {indexes: number[];delay: number; }ComponentV2 export struct SpinEight {Re…

MySQL全局優化

目錄 1 硬件層面優化 1.1 CPU優化 1.2 內存優化 1.3 存儲優化 1.4 網絡優化 2 系統配置優化 2.1 操作系統配置 2.2 MySQL服務配置 3 庫表結構優化 4 SQL及索引優化 mysql可以從四個層面考慮優化,分別是 硬件系統配置庫表結構SQL及索引 從成本和優化效果來看&#xf…

vue和springboot交互數據,使用axios【跨域問題】

vue和springboot交互數據,使用axios【跨域問題】 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是node.js和vue的使用。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系列文章】&…

FFMPEG 與 mp4

1. FFmpeg 中的 start_time 與 time_base start_time 流的起始時間戳(單位:time_base),表示第一幀的呈現時間(Presentation Time)。通常用于同步多個流(如音頻和視頻)。 time_base …

AI世界的崩塌:當人類思考枯竭引發數據生態鏈斷裂

AI世界的崩塌:當人類思考枯竭引發數據生態鏈斷裂 ——論過度依賴AI創作對技術進化的反噬 一、數據生態的惡性循環:AI的“自噬危機” 當前AI模型的訓練依賴于人類創造的原始數據——書籍、論文、藝術作品、社交媒體動態等。據統計,2025年全球…

C++【STL】(2)string

C【STL】string用法擴展 1. assign:為字符串賦新值 用于替換字符串內容,支持多種參數形式。 常用形式: // 用另一個字符串賦值 str.assign("Hello World");// 用另一個字符串的子串(從第6個字符開始,取5…

樹莓派4基于Debian GNU/Linux 12 (Bookworm)開啟VNC,使用MobaXterm連接VNC出現黑屏/灰屏問題

1. 開啟樹莓派的VNC服務 啟用VNC服務:通過raspi-config開啟 # 1. 通過 raspi-config 工具開啟 sudo raspi-config選擇 Interface Options → VNC → Yes退出時會自動啟動服務 檢查服務狀態: sudo systemctl status vncserver-x11-serviced正常輸出應顯示…

MongoDB使用x.509證書認證

文章目錄 自定義證書生成CA證書生成服務器之間的證書生成集群證書生成用戶證書 MongoDB配置java使用x.509證書連接MongoDBMongoShell使用證書連接 8.0版本的mongodb開啟復制集,配置證書認證 自定義證書 生成CA證書 生成ca私鑰: openssl genrsa -out ca…

Python爬蟲實戰:研究js混淆加密

一、引言 在當今數字化時代,數據已成為推動各行業發展的核心驅動力。網絡爬蟲作為一種高效的數據采集工具,能夠從互聯網上自動獲取大量有價值的信息。然而,隨著互聯網技術的不斷發展,許多網站為了保護自身數據安全和知識產權,采用了 JavaScript 混淆加密技術來防止數據被…

Java項目層級介紹 java 層級 層次

java 層級 層次 實體層 控制器層 數據連接層 Service : 業務處理類 Repository :數據庫訪問類 Java項目層級介紹 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java項目中,層級結構(Layered Architecture&#xf…

網絡安全頂會——SP 2025 論文清單與摘要

1、"Check-Before-you-Solve": Verifiable Time-lock Puzzles 時間鎖謎題是一種密碼學原語,它向生成者保證該謎題無法在少于T個順序計算步驟內被破解。近年來,該技術已在公平合約簽署和密封投標拍賣等場景中得到廣泛應用。然而,求解…