Kotlin反射詳解

反射是一種機制,它允許我們在運行時檢查、修改和操作類或對象的內部結構。反射開啟了動態編程的可能性,在開發庫、框架或工具等場景中非常有用。


Java 中的反射

在 Java 中,反射一直是實現動態編程的重要基石。它允許開發者在不提前知道類名的情況下,于運行時檢查類、接口、字段和方法。

Class stringClass = String.class;
Method[] methods = stringClass.getMethods();

代碼解釋

  • String.class 獲取 String 類對應的 Class 對象。

  • getMethods() 返回該類(以及其父類)的所有 公共方法 數組。


Kotlin 對反射的需求

雖然 Java 的反射功能很強大,但 Kotlin 引入了許多額外的語言特性,例如 數據類擴展函數可空類型 等,這些特性需要額外的反射能力。
Kotlin 提供了 kotlin.reflect 包來支持這些 Kotlin 特有的功能,允許對函數、屬性和類等語言元素進行檢查和操作。


Kotlin 反射依賴添加

Gradle (Kotlin DSL)

dependencies {implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.22")
}

解釋:為項目引入 kotlin-reflect 庫,以支持 Kotlin 反射功能。

Gradle (Groovy DSL)

dependencies {implementation "org.jetbrains.kotlin:kotlin-reflect:1.8.22"
}

解釋:與 Kotlin DSL 相同,只是寫法不同。

Maven

<dependencies><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-reflect</artifactId></dependency>
</dependencies>

解釋:在 Maven 項目中引入 Kotlin 反射庫。


數據類示例(無反射)

data class Source(val name: String, val age: Int)
data class Target(var name: String? = null, var age: Int = 0)val source = Source("John", 20)val target = Target().apply {name = source.nameage = source.age
}

解釋
手動將 Source 的屬性賦值給 Target。當屬性較多或運行時無法確定屬性名時,這種方法會變得繁瑣。


使用反射實現通用屬性映射

fun <S : Any, T : Any> map(source: S, target: T) {val sourceProperties = source::class.memberPropertiesval targetProperties = target::class.memberPropertiessourceProperties.forEach { sourceProperty ->targetProperties.find { it.name == sourceProperty.name }?.let { targetProperty ->if (targetProperty is KMutableProperty<*>) {targetProperty.setter.call(target, sourceProperty.getter.call(source))}}}
}val target = Target()
map(source, target)

解釋

  • source::class.memberProperties 獲取源對象的所有屬性。

  • 找到與源屬性同名的目標屬性,并調用 setter 方法賦值。

  • 泛型 <S, T> 使得該方法適用于任意兩個類(只要屬性名匹配)。


Kotlin 反射核心類

val stringClass = String::class
val stringType = stringClass.starProjectedType

解釋

  • KClass:Kotlin 類的反射對象。

  • KCallable:函數與屬性的通用接口。

  • KFunction:函數的反射對象。

  • KProperty:屬性的反射對象。


基本操作示例

  1. 實例化類
val stringClass = String::class
val instance = stringClass.createInstance()

代碼解釋

  • String::class獲取 Kotlin 的 KClass 對象(表示 String 類的元信息)
  • stringClass.createInstance()調用該類的 無參構造函數(primary constructor)來創建一個新的(String)實例。
  1. 調用方法
val function = String::toLowerCase
val result = function.call("HELLO")  // "hello"

代碼解釋

  • 通過 Kotlin 反射 獲取類的屬性引用 (:😃。
  • 動態調用 toLowerCase 方法,并傳入"HELLO" 作為 調用者(也就是接收者對象)。。
  1. 訪問與修改屬性
data class Person(val name: String, var age: Int)val person = Person("John", 20)
val ageProperty = Person::age
println(ageProperty.get(person))  // 20
ageProperty.set(person, 21)
println(person.age)  // 21

代碼解釋

  • 通過 Kotlin 反射 獲取類的屬性引用 (:😃。
  • 用 get() 和 set() 在運行時(傳入接收者對象)讀取與修改屬性值。

高級操作

  1. 泛型類型信息.
val list = listOf(1, 2, 3)
val type = list::class.typeParameters
println(type)  // [E]

代碼解釋

  • 返回該類在定義時的泛型形參列表
  1. 高階函數參數類型
fun foo(block: () -> Unit) { block() }val function = ::foo
val parameter = function.parameters.first()
println(parameter.type)  // Function0<kotlin.Unit>

代碼解釋

  • 獲取函數 foo 的引用,賦給 function 變量。(function的類型是KFunction)
  • 返回一個包含該函數所有參數的列表(類型為 KParameter)
  • 取第一個參數,也就是這里的 block
  • 打印該參數的 Kotlin 類型

反射的優勢與限制
優勢

  • 實現動態功能(如通用對象映射、設計模式等)
  • 框架與庫開發中不可或缺

限制

  • 性能開銷大(運行時計算多)
  • 可能引發安全問題(訪問私有成員)
  • 并非所有類都能通過反射實例化(如匿名類、內部類)

總結

在 Kotlin 中,反射是一個功能強大的運行時檢查與操作工具,可用于:

  • 自動對象映射
  • 實現設計模式
  • 框架與庫開發

但需要謹慎使用,避免在性能敏感或安全性要求高的場景中濫用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918399.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918399.shtml

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

相關文章

學習嵌入式-IMX6ULL學習——中斷

volatile&#xff1a;易變的&#xff0c;防止系統優化對寄存器做處理的時候使用&#xff0c;在進行寫1清零操作時&#xff0c;防止該操作被系統優化&#xff1b;一、GIC通用中斷控制器1.GIC通用中斷控制器GIC接收眾多外部中斷&#xff0c;然后對其進行處理&#xff0c;最終通過…

HENGSHI SENSE 6.0 功能-AI 查數助手

面向所有AI Agent開放BI和數據分析能力 AI 查數助手 6.0版本中&#xff0c;我們AI助手的優化是比較深入且全面的。從問答效率到集成能力&#xff0c;都得到了大的躍升&#xff0c;是智能問數應用場景的重大升級以及體驗的全方位優化。我們優化了 AI 助手執行流程&#xff0c;…

降壓型DCDC電源芯片推薦-芯伯樂XBL4001 40V/5A

在電子設備不斷追求高性能與低功耗的今天&#xff0c;電源管理芯片的重要性不言而喻。芯伯樂主推的XBLW-XBL4001芯片&#xff0c;憑借其出色的設計與穩定的性能&#xff0c;為電源管理領域帶來了一款實用的新選擇。一、芯片概述XBLW-XBL4001是一款降壓型&#xff08;Buck&#…

uni-app app端安卓和ios如何申請麥克風權限,喚起提醒彈框

代碼包含功能如下&#xff1a; 1、判斷推送權限是否開啟 2、判斷定位權限是否開啟 3、判斷麥克風權限是否開啟 4、判斷相機權限是否開啟 5、判斷相冊權限是否開啟 6、判斷通訊錄權限是否開啟 7、判斷日歷權限是否開啟 8、判斷備忘錄權限是否開啟 9、Android權限查詢 10、檢查系…

關于 Rust 異步(無棧協程)的相關疑問

這是一個記錄問題求助的文章。關于 waker 與運行時的合作方式我膚淺地學習了 Rust 異步底層實現原理&#xff0c;關于 Future、waker 和運行時等。關于 waker 我有三點猜測&#xff1a;waker 是由實現執行器的人提供的在執行器中會調用 epoll_wait&#xff0c;epoll 返回 fd&am…

stm32項目(25)——基于stm32的植物生長箱環境監測系統

1.實現功能 測 環境溫濕度、光照強度、土壤濕度、水箱水位 手機APP顯示 溫度過低-->打開加熱板 濕度過低-->打開水泵 土壤濕度低-->開水泵 --->只要有指標低于閾值時 就蜂鳴器報警 光強弱-->補光 水位低-->抽水 OLED屏幕實時顯示各種信息 分…

golang 基礎案例_02

1.鎖有時候我們的代碼中可能會存在多個 goroutine 同時操作一個資源&#xff08;臨界區&#xff09;的情況&#xff0c;這種情況下就會發生競態問題&#xff08;數據競態&#xff09;。(1)、互斥鎖&#xff1b;(2)、讀寫互斥鎖&#xff1b;(3)、sync.WaitGroup&#xff1b;(4)、…

C++算法·前綴和

前綴和(Prefix(Prefix(Prefix Sum)Sum)Sum)的定義 前綴和是一種高效處理區間求和問題的算法技巧 其核心思想是通過預處理構建一個前綴和數組 使得后續的區間和查詢可以在常數時間O(1)O(1)O(1)內完成 核心概念 定義 給定一個數組a[1...n]a[1...n]a[1...n],其前綴和數組s[1...…

JavaEE 初階第十七期:文件 IO 的 “管道藝術”(下)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 目錄 一、Java文件內容寫入 1.1. OutputStream 二、字符流讀取和寫入 2.1. Reader 2.2. Writer 三、示例練習 3.1. 查找文件功能 一、Java文件內容寫入 1.1. OutputStream OutputStream同樣只是?個抽…

【liunx】web高可用---nginx

NGINX簡介Nginx&#xff08;發音為 “engine x”&#xff09;是一款由俄羅斯程序員 Igor Sysoev 開發的 輕量級、高性能的 HTTP 和反向代理服務器&#xff0c;同時也是一個 IMAP/POP3/SMTP 代理服務器。自 2004 年首次發布以來&#xff0c;Nginx 憑借其 高并發處理能力、低內存…

FPGA+護理:跨學科發展的探索(二)

FPGA護理&#xff1a;跨學科發展的探索&#xff08;二&#xff09; 系列文章目錄 FPGA護理&#xff1a;跨學科發展的探索&#xff08;一&#xff09; 文章目錄FPGA護理&#xff1a;跨學科發展的探索&#xff08;二&#xff09;系列文章目錄引言三、FPGA 在精神醫學護理中的應用…

localforage的數據倉庫、實例、storeName和name的概念和區別

在 localForage 中&#xff0c;數據倉庫、實例、storeName 和 name 是核心概念&#xff0c;用于管理底層存儲&#xff08;IndexedDB/WebSQL/localStorage&#xff09;。以下是詳細解釋和區別&#xff1a; 1. 數據倉庫 (Database) 定義&#xff1a;指底層的物理數據庫&#xff…

使用MAS(Microsoft Activation Scripts)永久獲得win10專業版和office全套

文章目錄Microsoft Activation Scripts簡介下載地址使用方法Microsoft Activation Scripts簡介 MAS是Microsoft Activation Scripts縮寫。 主要提供如下功能&#xff1a; 使用該腳本可以永久獲得win10專業版和office全套&#xff08;可選&#xff09; 下載地址 https://pan…

零 shot 語義+在線閉環:深度學習讓機器人學會“主動”

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;在當下&#xff0c;機器人與深度學習的融合正成為AI領域的核心發展趨勢&#xff0c;相關研究在頂會頂刊上熱度居高不下。從ICLR到CoRL&#xff0c;諸多前沿成果不斷涌現&am…

Nginx學習筆記(三)——在 CentOS 7 中配置阿里云鏡像源

&#x1f4da; Nginx學習筆記&#xff08;三&#xff09;——在 CentOS 7 中配置阿里云鏡像源 在 CentOS 7 中配置阿里云鏡像源可顯著提升軟件安裝和更新的速度&#xff0c;以下是詳細操作步驟&#xff1a; &#x1f527; 配置阿里云鏡像源步驟 1?? 備份原有源配置 sudo mv /…

WebSocket--簡單介紹

一、什么是 WebSocket&#xff1f;定義&#xff1a;WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。作用&#xff1a;實現客戶端&#xff08;瀏覽器&#xff09;和服務器之間的實時、雙向通信。優勢&#xff1a;連接保持&#xff0c;通信實時性強&#xff08;不像 HT…

【STM32 LWIP配置】STM32H723ZG + Ethernet +LWIP 配置 cubemx

STM32H723ZG LAN8742 Ethernet LWIP 配置 cubemx &#x1f31e;這邊記錄一下這塊mcu 配置以太網的過程&#xff0c;IDE是KEIL MDK&#xff0c;其實就是在下面多次提到的blog的基礎上 在scatter file進行配置 首先&#xff0c;如果想要簡單一點 直接去cubemx 那邊獲取相關的例…

EI檢索-學術會議 | 人工智能、虛擬現實、可視化

第五屆人工智能、虛擬現實與可視化國際學術會議&#xff08;AIVRV 2025&#xff09;定于2025年9月5-7日在中國 成都召開。人工智能正驅動各行業智能化轉型&#xff0c;提升效率與質量&#xff1b;虛擬現實技術以其沉浸感重塑教育、娛樂、醫療等領域體驗&#xff1b;可視化技術…

力扣(H指數)

一、題目分析 &#xff08;一&#xff09;問題描述 給定一個整數數組 citations&#xff0c;其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。我們需要計算并返回該研究者的 H 指數。根據維基百科定義&#xff1a;H 指數代表“高引用次數”&#xff0c;一名科研人員的…

標準io(1)

標準I/O基礎概念標準I/O&#xff08;Standard Input/Output&#xff09;是C語言提供的一組高級文件操作函數&#xff0c;位于<stdio.h>頭文件中。與低級I/O&#xff08;如Unix的系統調用read/write&#xff09;相比&#xff0c;標準I/O引入了緩沖機制&#xff0c;能顯著提…