Kotlin屬性引用詳解


繼續來學習Kotlin反射相關的,這次主要是跟反射屬性相關的東東。

屬性引用(Property Reference):

屬性引用的用法與函數(方法)引用的用法是完全一致,都是通過::形式來引用的。下面看代碼:

其實這個屬性引用就類似於在Java反射屬性的方式差不多,目的都是通過反射來操作屬性的一些東東, 其中"::a"其實表示的是類型KProperty<Int>的屬性對象,那們我們可以通過get()來獲取其值,也可以通過name屬性來獲取其名字,下面來看一下KProperty的細節:

就如我們程序中所寫的:

那這個get()方法是在哪定義的呢?

那。。name屬性又在哪定義的呢?

在上面代碼中a是定義成了一個常量,那如果定義一個變量呢, 比如:

其實對於可變屬性來說,比如說 var b = 5,::b返回的是類型KMultipleProperty<Int>的值,它擁有一個set()方法。下面來調用一下:

那。。KMutableProperty跟KProperty有啥關系呢?瞅一下:

屬性引用在函數的應用:

其實屬性引用也是可以用在函數上的,下面看個例子:

下面來分析一下該程序,length是String類中定義的一個屬性:

而map方法接收的是一個Lambda表達式:

其中T參數就代表集合中的每一個String的元素,而R則為整個函數返回的值,那咱們傳的是一個屬性引用其執行的機制是咋樣的呢?其實是這樣的:每個元素都傳給map的T,然后再調用它的.lenth屬性來作為函數R的返回值,需好好體會一下,有點不太好理解。

我們現在定義的屬性都是沒有接收者的,如下:

 

那如果將屬性定義在一個類當中,也就是有接收者,那其屬性引用的使用又會發生啥變化呢,看代碼:

下面來定義一個屬性引用:

此時如果想打印MyClass中的x屬性的值,則需要傳一個接收者MyClass了,因為該屬性不是包級別的了,如下:

具體調用如下:

所以總結一下:如果想要訪問一個類中的成員屬性,需要使用全限定名稱才行。

擴展屬性:

下面咱們給String系統類添加一個擴展屬性:

該屬性是獲取字符串的第一個字符,那對於一個字符串想用字符引用的方式來調用下該如何調用呢?下面瞅下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM