繼續來學習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系統類添加一個擴展屬性:
該屬性是獲取字符串的第一個字符,那對於一個字符串想用字符引用的方式來調用下該如何調用呢?下面瞅下: