KT中代理属性的实现及使用案例分析
普通的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中代理属性的实现及使用案例分析相关推荐
- Citrix Xendesktop5中创建虚拟机失败的2个案例分析
Xendesktop5中无法创建虚拟机的2个问题分析 1. case1 用户在添加新的桌面的过程中提示: The catalog has the following errors: Fai ...
- 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...
- 系统集成项目管理工程师 案例问答题(案例分析中常见找错问题)
有兴趣了解或者考软考的小伙伴可以到B站看看这个老师讲的课程. 学计算机的小伙伴有时间可以考一个软考证书,这是中国计算机技术职业资格网官网. 这是广东人事考试网,这里面会公布广东的报考信息,没记错的话是 ...
- 地理信息系统(ArcGIS)在水文水资源、水环境中的实践技术应用及案例分析
目录 专题一 ArcGIS:数据管理 专题二 ArcGIS:数据转换 专题三 ArcGIS:地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及 ...
- iOS运行时-使用Runtime向Category中添加属性以及运行时介绍
前言 了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category ...
- 这篇文章,我们来谈一谈Spring中的属性注入
本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...
- python私有属性怎么定义_Python中私有属性的定义方式
Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...
- php js怎么去掉类属性,如何修改DOM中的属性,类和样式
通过jQuery来获取要修改的DOM元素,然后通过JavaScript中方法来对属性.类以及样式进行修改 今天在本篇文章中将分享的是如何通过修改html元素节点的样式,类和属性来进一步的更改dom,, ...
- junit集成Hamcrest测试集合中某个属性是否包含特定值
junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...
最新文章
- 框架开发之Java注解的妙用
- Redis:事件驱动(IO多路复用)
- 华为Dorado固态存储技术手册合集
- ehcache 缓存java对象_Ehcache 整合Spring 使用页面、对象缓存
- 腐烂--发霉--生锈
- js 多个定时器_Node.js系列深入浅出Node模块化开发——CommonJS规范
- 【实验报告】LFM信号产生与频谱分析(记录一次实验:《电类综合实验》)
- 软件测试技术——安全性测试
- 智能建造如何转型升级?智慧工地引领建筑行业智能化信息化发展
- 电商与硬件——从购买电脑的角度学计算机硬件基础
- 桃园 更新完列表 不显示服务器,桃园7月25日更新内容详解
- Linux RabbitMQ - CLI tool fails to authenticate with the server
- 【Java开源项目】消息推送平台 日志引入
- Android UI - 粒子爆炸特效
- aria2 txt导入_aria2 让下载提速
- 解决GitHub频繁要求verify email的问题
- Spark 参数说明
- Linux运维管理的必备工具
- Android WebView控件
- 你真的搞懂了什么叫敏捷式 ( Agile ) 开发吗?