继续来学习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系统类添加一个扩展属性:

该属性是获取字符串的第一个字符,那对于一个字符串想用字符引用的方式来调用下该如何调用呢?下面瞅下:

最新文章

  1. 浅谈fls3的一个压缩问题
  2. Java8简单的本地缓存实现
  3. Codeforces 675C Money Transfers 思维题
  4. 设计模式~简单工厂模式(Factory)
  5. System.exit(0)和System.exit(1)区别:
  6. linux命令之chown命令
  7. 织梦dedecms5.7后台进去就卡死解决方法
  8. MVC入门之.Net语法学习
  9. POJ 1379 Run Away
  10. android如何调用显示和隐藏系统默认的输入法(一)
  11. Easyui中tree组件实现搜索定位功能及展开节点定位
  12. Percona Data Recovery Tool for InnoDB工具恢复单表的案例
  13. 聊聊JAVA中 String类为什么不可变
  14. java基础-静态,非静态(构造)代码块,类加载
  15. Codeforces Round #437 Div. 1
  16. [SHOI2009] 会场预约
  17. font-face 跨域解决
  18. matplotlib的颜色及线条控制
  19. 深入浅出 JMS(二) - ActiveMQ 入门指南
  20. 创建TFS备份计划失败,错误提示:TF400997

热门文章

  1. C++17新特性optional和string_view
  2. 使用vs code开发.net core2.2时OmniSharp.MSBuild.ProjectLoader无法解析&quot;xxx&quot;的解决方法
  3. java实现视频转码
  4. canvas实现饼状图
  5. IntelliJ IDEA 常用快捷键 之 Windows 版
  6. linux安装Elasticsearch详细步骤
  7. a++与++a,谈谈C++的参数传递
  8. 【Rust】使用cargo创建项目及cargo源的替换
  9. 牛客CSP-S提高组赛前集训营2 T2沙漠点列
  10. POI2015 WYC