普通的delegate代理属性get/set方法,可以看到类中会声明一个数组保存需要代理的所有KProperty字段信息(包含类名,字段名称,字段签名())

PS:冷知识map也可以用于委托,只要有get/set方法就可以用作委托,只不过map的key是字段的名称,value才是真正的值,这个有点限制哈哈,但是如果想要自己实现map也可以

public final class TestDelegateProperty {// $FF: synthetic field
//自动生成的代理属性数组,保存着对应的字段名称及字段的get方法用于定位到对应的代理类中获取get方法
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property1(new PropertyReference1Impl(TestDelegateProperty.class, "delegateProperty", "getDelegateProperty()Ljava/lang/String;", 0))};
@NotNull
private final DelegatePropertyClass delegateProperty$delegate = new DelegatePropertyClass();@NotNull
public final String getDelegateProperty() {return this.delegateProperty$delegate.getValue(this, $$delegatedProperties[0]);
}
}

如果有多个代理属性呢?也很简单,无非就是代理属性数组中再多几个元素和对应的代理实例:

public final class TestDelegateProperty {// $FF: synthetic field
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.mutableProperty1(new MutablePropertyReference1Impl(TestDelegateProperty.class, "delegateProperty", "getDelegateProperty()Ljava/lang/String;", 0)), (KProperty)Reflection.mutableProperty1(new MutablePropertyReference1Impl(TestDelegateProperty.class, "delegateProperty2", "getDelegateProperty2()Ljava/lang/String;", 0))};
@NotNull
private final DelegatePropertyClass delegateProperty$delegate = new DelegatePropertyClass();
@NotNull
private final DelegatePropertyClass delegateProperty2$delegate = new DelegatePropertyClass();@NotNull
public final String getDelegateProperty() {return this.delegateProperty$delegate.getValue(this, $$delegatedProperties[0]);
}public final void setDelegateProperty(@NotNull String var1) {Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.delegateProperty$delegate.setValue(this, $$delegatedProperties[0], var1);
}@NotNull
public final String getDelegateProperty2() {return this.delegateProperty2$delegate.getValue(this, $$delegatedProperties[1]);
}public final void setDelegateProperty2(@NotNull String var1) {Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.delegateProperty2$delegate.setValue(this, $$delegatedProperties[1], var1);
}
}

案例:为用户中心相关的属性进行代理过滤

比如我们需要实现对用户中心相关属性赋值时候的一些过滤:

用户属性代理KT文件


/*** 创建对应模式下的过滤委派*/
//提供指定限定词的方式进行过滤
fun userDelegateByFiled(filterField: String) =UserPropertyDelegateByField(filterField)//提供块体的方式进行过滤
fun userDelegateByFunc(filterFunc: (String) -> Boolean) =UserPropertyDelegateByFunc(filterFunc)/*** 提供指定限定词的方式进行过滤*/
class UserPropertyDelegateByField(private val filterField: String) {private var userCenterProperty = ""/*** @param thisRef:thisRef代表的是属性所属的类* @param property:KProperty类实例,代表的是kotlin的属性拥有字段名称,字段所属的类,字段get/set的对应方法签名*/operator fun <T> getValue(thisRef: T, property: KProperty<*>): String {return userCenterProperty}/*** 对于用户体系的属性进行过滤* @param thisRef:thisRef代表的是属性所属的类* @param property:KProperty类实例,代表的是kotlin的属性拥有字段名称,字段所属的类,字段get/set的对应方法签名* @param value 传入的对应值*/operator fun <T> setValue(thisRef: T, property: KProperty<*>, value: String) {if (!value.contains(filterField)) {userCenterProperty = value}}
}/*** 提供块体的方式进行过滤*/
class UserPropertyDelegateByFunc(private val filterFunc: (String) -> Boolean) {private var userCenterProperty = ""/*** @param thisRef:thisRef代表的是属性所属的类* @param property:KProperty类实例,代表的是kotlin的属性拥有字段名称,字段所属的类,字段get/set的对应方法签名*/operator fun <T> getValue(thisRef: T, property: KProperty<*>): String {return userCenterProperty}/*** 对于用户体系的属性进行过滤* @param thisRef:thisRef代表的是属性所属的类* @param property:KProperty类实例,代表的是kotlin的属性拥有字段名称,字段所属的类,字段get/set的对应方法签名* @param value 传入的对应值*/operator fun <T> setValue(thisRef: T, property: KProperty<*>, value: String) {if (filterFunc(value)) {userCenterProperty = value}}
}

使用代码

//用户IDprivate var userCenterId by userDelegateByFiled("defaultUser")//用户生日private var userCenterBirthday by userDelegateByFunc(::userBirthdayFilterFunc)//用户生日信息赋值过滤private fun userBirthdayFilterFunc(birthday: String): Boolean {if (birthday.contains("default")) {return false}return true}

KT中代理属性的实现及使用案例分析相关推荐

  1. Citrix Xendesktop5中创建虚拟机失败的2个案例分析

    Xendesktop5中无法创建虚拟机的2个问题分析 1.       case1 用户在添加新的桌面的过程中提示: The catalog has the following errors: Fai ...

  2. 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析

    前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...

  3. 系统集成项目管理工程师 案例问答题(案例分析中常见找错问题)

    有兴趣了解或者考软考的小伙伴可以到B站看看这个老师讲的课程. 学计算机的小伙伴有时间可以考一个软考证书,这是中国计算机技术职业资格网官网. 这是广东人事考试网,这里面会公布广东的报考信息,没记错的话是 ...

  4. 地理信息系统(ArcGIS)在水文水资源、水环境中的实践技术应用及案例分析

    目录 专题一 ArcGIS:数据管理 专题二 ArcGIS:数据转换 专题三 ArcGIS:地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及 ...

  5. iOS运行时-使用Runtime向Category中添加属性以及运行时介绍

    前言 了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category ...

  6. 这篇文章,我们来谈一谈Spring中的属性注入

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...

  7. python私有属性怎么定义_Python中私有属性的定义方式

    Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...

  8. php js怎么去掉类属性,如何修改DOM中的属性,类和样式

    通过jQuery来获取要修改的DOM元素,然后通过JavaScript中方法来对属性.类以及样式进行修改 今天在本篇文章中将分享的是如何通过修改html元素节点的样式,类和属性来进一步的更改dom,, ...

  9. junit集成Hamcrest测试集合中某个属性是否包含特定值

    junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...

最新文章

  1. 框架开发之Java注解的妙用
  2. Redis:事件驱动(IO多路复用)
  3. 华为Dorado固态存储技术手册合集
  4. ehcache 缓存java对象_Ehcache 整合Spring 使用页面、对象缓存
  5. 腐烂--发霉--生锈
  6. js 多个定时器_Node.js系列深入浅出Node模块化开发——CommonJS规范
  7. 【实验报告】LFM信号产生与频谱分析(记录一次实验:《电类综合实验》)
  8. 软件测试技术——安全性测试
  9. 智能建造如何转型升级?智慧工地引领建筑行业智能化信息化发展
  10. 电商与硬件——从购买电脑的角度学计算机硬件基础
  11. 桃园 更新完列表 不显示服务器,桃园7月25日更新内容详解
  12. Linux RabbitMQ - CLI tool fails to authenticate with the server
  13. 【Java开源项目】消息推送平台 日志引入
  14. Android UI - 粒子爆炸特效
  15. aria2 txt导入_aria2 让下载提速
  16. 解决GitHub频繁要求verify email的问题
  17. Spark 参数说明
  18. Linux运维管理的必备工具
  19. Android WebView控件
  20. 你真的搞懂了什么叫敏捷式 ( Agile ) 开发吗?

热门文章

  1. WORD中的自动编号实例详解(多图)
  2. 吐血整理的Google Guava
  3. 专科学历事业单位工资计算机,事业单位的人告诉你:学历跟入编之后的待遇关系有多大!很直接!...
  4. linux内存泄漏通用排查方法
  5. 7-2 横平竖直 (10分)
  6. streamlit使用altair画图并保存png图片
  7. SpringBoot资料合集-03【Spring Boot 热部署与日志】
  8. 虚幻引擎 制作像素化消散效果(下)
  9. OAuth2.0第三方授权
  10. 第十三届蓝桥杯c++b组痛失国一复盘