前言
其實關于反射這塊內容在我們平時至少作為Android開發(fā)還是用的蠻少的,不過在閱讀源碼時或者開發(fā)一些SDK時就遇到了很多,尤其是看到什么 KProperty 類型類似的參數的時候,總是不熟悉,所以我準備好好梳理這一部分的知識點。
其中反射有Java的反射和Kotlin的反射,它倆其實差不多,不過API不同,我們后續(xù)都會逐一介紹。
正文
既然準備全面梳理,所以還是從反射概念說起,慢慢道來。
啥是反射
網上有很多文章都是直接上來就告訴你如何使用,但是這樣你不能知其所以然,先說反射的概念:一種在運行時動態(tài)地訪問對象屬性和方法的方式,而不需要事先確定這些屬性是什么。
什么是運行時
熟悉Java運行的開發(fā)者都知道,我們平時寫的.java代碼,會被編譯成.class文件,然后被JVM加載,這時我們的代碼就處于運行時了,假如我們定義了一個類People的對象people,到運行時就能獲取People這個類的一些信息了。
而保存這些信息的類就是我們非常熟悉的Class類了,后面我們細說。
為什么會有這種需求
既然我定義了一個類People,那我在編譯期不就知道它里面的屬性了嗎 那為什么還要反射呢
這里舉個很常見的例子,那就是序列化庫,假如你開發(fā)了一個序列化庫XXJSON,這時你開發(fā)時你肯定不知道別人想把json轉成啥類型,所以只有在運行時拿到別人想轉換的類型A,然后獲取類型A中有哪些屬性,才可以進行轉換,這時就可以使用反射來實現。
這個序列化庫的思想在很多Java框架中都有,就是靈活配置的思想,你只需要傳入特定的類型或者在XML中定義特定的類型,在運行時再由這個庫對它進行處理。
反射可以獲取哪些信息
既然了解了啥是反射,那通過反射可以獲取一個類的哪些信息呢,這些信息包括類型信息、父類信息、方法、屬性,包括方法的修飾符、參數等等,反正就是很強大的功能,我們到后面細說。
Kotlin和Java反射
作為熟悉Kotlin的同學都知道Kotlin也是編譯成字節(jié)碼在JVM中運行,那Kotlin有又優(yōu)化或者開發(fā)了反射內容嗎
答案是有的,當你使用Kotlin語言時,你完全可以使用Java的反射以及API,但是Kotlin語言又加了庫,專門來新增了一些API,這些API實現的功能完全包含了Java反射API實現的功能,但是也有一些獨特的Kotlin功能,比如可空類型、是否是數據類這種。
不僅如此,Kotlin的反射API更符合人們使用,當然這也是我個人覺得,等后面我們解析其方法時再細說。
假如你想使用Kotlin的反射庫,Kotlin默認是不帶的,原因是減小內存使用,可以通過添加下面依賴來完成:
//kotlin版本和使用的版本一致
implementation "org.jetbrains.kotlin:kotlin-reflect:1.5.21"
具體使用,我們后面文章繼續(xù)。
總結
這里只是一個引子,來說明了什么反射和反射的意義,以及讓Android開發(fā)者明白如果使用Kotlin的話,可以使用Kotlin庫中的反射API。
后面我們會逐步介紹和對比Java和Kotlin的反射實現以及反射的具體使用例子。