继续来学习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系统类添加一个扩展属性:
该属性是获取字符串的第一个字符,那对于一个字符串想用字符引用的方式来调用下该如何调用呢?下面瞅下: