Kotlin屬性引用詳解

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

屬性引用(Property Reference):學習

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

其實這個屬性引用就相似於在Java反射屬性的方式差很少,目的都是經過反射來操做屬性的一些東東, 其中"::a"其實表示的是類型KProperty<Int>的屬性對象,那們咱們能夠經過get()來獲取其值,也能夠經過name屬性來獲取其名字,下面來看一下KProperty的細節:3d

就如咱們程序中所寫的:對象

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

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

在上面代碼中a是定義成了一個常量,那若是定義一個變量呢, 好比:字符串

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

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

屬性引用在函數的應用:

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

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

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

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

咱們如今定義的屬性都是沒有接收者的,以下:

 

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

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

此時若是想打印MyClass中的x屬性的值,則須要傳一個接收者MyClass了,由於該屬性不是包級別的了,以下:

具體調用以下:

因此總結一下:若是想要訪問一個類中的成員屬性,須要使用全限定名稱才行。

擴展屬性:

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

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

相關文章
相關標籤/搜索