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

news/2024/11/24 12:51:43/

普通的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}

http://www.ppmy.cn/news/22870.html

相关文章

day07_Java中的流程控制(循环结构丶break丶continue)

循环概述 循环语句可以在满足循环条件的情况下&#xff0c;反复执行某一段代码&#xff0c;这段被重复执行的代码被称为循环体语句&#xff0c;当反复执行这个循环体时&#xff0c;需要在合适的时候把循环判断条件修改为false&#xff0c;从而结束循环&#xff0c;否则循环将一…

Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

各位朋友你们好呀。今天是立春&#xff0c;明天就是正月十五元宵节了&#xff0c;这种立春 元宵相隔的时候&#xff0c;可是很难遇到的&#xff0c;百年中就只有几次。在这提前祝大家元宵快乐。 今天给大家带来的是Vue 3 中的极致防抖/节流&#xff08;含常见方式防抖/节流&a…

binwalk远程命令执行漏洞原理以及演示 CVE-2022-4510

简介 根据cve官方描述&#xff0c;从版本2.1.2到 2.3.3的binwalk中发现了一个路径遍历漏洞。此漏洞允许远程攻击者在安装受影响的binwalk机子上执行任意代码 什么是PFS文件 PFS文件是由PhotoFiltre Studio&#xff08;图像修饰程序&#xff09;创建的选择文件。 它包含图像编…

第2讲 Exception和Error有什么区别?

第2讲 | Exception和Error有什么区别&#xff1f; 世界上存在永远不会出错的程序吗&#xff1f;也许这只会出现在程序员的梦中。随着编程语言和软件的诞生&#xff0c;异常情况就如影随形地纠缠着我们&#xff0c;只有正确处理好意外情况&#xff0c;才能保证程序的可靠性。 J…

SpringCloud系列 Nacos配置管理

在Nacos中添加配置信息&#xff1a; 工程引入&#xff1a; nacos配置管理依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> bootstrap.yml&a…

第03讲:BootStrap

贯穿案例展示–车位管理 导入&#xff1a;为什么要使用BootStrap Bootstrap&#xff0c;来自 Twitter&#xff0c;是一款受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。 大家可以在github上下载&am…

动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)

动态主机配置协议(DHCP&#xff0c;Dynamic Host Configuration ProtocolDHCPlinux:安装操作指南查看MAC物理地址方法&#xff1a;拓展知识1&#xff1a;拓展知识2&#xff1a;拓展&#xff1a;DHCP 动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration …

自己整理的一些前端知识点,包括vue2,vue3,js,css,微信小程序等

Vue3自考题 1&#xff0c;如何使用vue3的组合式api 答&#xff1a; 在普通的前端项目工程中&#xff0c;在script标签中增加setup即可使用api使用setup()钩子函数 2&#xff0c;computed 与各个watch之间和method的区别 答&#xff1a; ​ 注意&#xff1a; 不要在计算属…