菜单
登录注册
欢 迎
登录
自动登录
忘记密码?
新朋友
注册
注册
老朋友
登录
笔记内容为空!
TA的笔记树 >>
kotlin对象属性值拷贝工具类
kotlin工具类
``` import java.lang.reflect.Field import kotlin.reflect.KProperty1 import kotlin.reflect.full.memberProperties /** * Created by vanki on 2018/3/5 15:34. */ object EntityUtil { /** * 复制同类型属性值操作, dest字段值 = src字段值 */ fun
copyVal(dest: T1, src: T2, vararg excludeFields: String): T1 { return if (dest::class == src::class) { EntityUtil.copyValCommon(dest, src, CopyType.ALL, excludeFields) } else { EntityUtil.copyValCommonOfDiffObj(dest, src, CopyType.ALL, excludeFields) } } /** * 复制同类型属性值操作, dest字段值 = src字段值 (仅当dest字段值为
时才拷贝) */ fun
copyValOnlyDestNull(dest: T1, src: T2, vararg excludeFields: String): T1 { return if (dest::class == src::class) { EntityUtil.copyValCommon(dest, src, CopyType.ONLY_DEST_NULL, excludeFields) } else { EntityUtil.copyValCommonOfDiffObj(dest, src, CopyType.ONLY_DEST_NULL, excludeFields) } } /** * 复制同类型属性值操作, dest字段值 = src字段值 (仅当dest字段值为
或 <空> 时才拷贝) */ fun
copyValOnlyDestEmpty(dest: T1, src: T2, vararg excludeFields: String): T1 { return if (dest::class == src::class) { EntityUtil.copyValCommon(dest, src, CopyType.ONLY_DEST_EMPTY, excludeFields) } else { EntityUtil.copyValCommonOfDiffObj(dest, src, CopyType.ONLY_DEST_EMPTY, excludeFields) } } /** * 同类型两对象复制属性值操作 */ private fun
copyValCommon(dest: T1, src: T2, copyType: CopyType, excludeFields: Array
?): T1 { val kClass = dest::class if (kClass != src::class) return dest val jClass = kClass.java val members = kClass.memberProperties var srcValTmp: Any? var destValTmp: Any? var kPropertyName: String? var destFieldMap: Map
? = null for (kProperty in members) { if ("PUBLIC" != kProperty.visibility.toString()) continue kPropertyName = kProperty.name if (excludeFields != null && excludeFields.contains(kPropertyName)) continue destValTmp = kProperty.call(dest) srcValTmp = kProperty.call(src) if ((destValTmp == null && srcValTmp == null) || (destValTmp == srcValTmp)) continue if (copyType == CopyType.ALL || (copyType == CopyType.ONLY_DEST_NULL && destValTmp == null) || (copyType == CopyType.ONLY_DEST_EMPTY && ((destValTmp == null) || (destValTmp is String && "" == destValTmp.trim()))) ) { if (destFieldMap == null) { destFieldMap = declareFields(jClass) } val jField = destFieldMap[kPropertyName] ?: continue val bakAccessible = jField.isAccessible jField.isAccessible = true jField.set(dest, srcValTmp) jField.isAccessible = bakAccessible } } return dest } private fun
copyValCommonOfDiffObj(dest: T1, src: T2, copyType: CopyType, excludeFields: Array
?): T1 { val kDestClass = dest::class val kSrcClass = src::class val jDestClass = kDestClass.java val destMembers = kDestClass.memberProperties val mapOfSrcProperties: MutableMap
> = mutableMapOf() kSrcClass.memberProperties.forEach { mapOfSrcProperties[it.name] = it } var srcValTmp: Any? var destValTmp: Any? var kPropertyName: String? var destFieldMap: Map
? = null for (destKProperty in destMembers) { if ("PUBLIC" != destKProperty.visibility.toString()) continue kPropertyName = destKProperty.name if (excludeFields != null && excludeFields.contains(kPropertyName)) continue val srcKProperty = mapOfSrcProperties[kPropertyName] ?: continue if (srcKProperty.returnType != destKProperty.returnType) continue // 同名不同类型 destValTmp = destKProperty.call(dest) srcValTmp = srcKProperty.call(src) if ((destValTmp == null && srcValTmp == null) || (destValTmp == srcValTmp)) continue if (copyType == CopyType.ALL || (copyType == CopyType.ONLY_DEST_NULL && destValTmp == null) || (copyType == CopyType.ONLY_DEST_EMPTY && ((destValTmp == null) || (destValTmp is String && "" == destValTmp.trim()))) ) { /** * 赋值 */ if (destFieldMap == null) { destFieldMap = declareFields(jDestClass) } val jDestField = destFieldMap[kPropertyName] ?: continue val bakAccessible = jDestField.isAccessible jDestField.isAccessible = true jDestField.set(dest, srcValTmp) jDestField.isAccessible = bakAccessible } } return dest } private fun declareFields(cls: Class<*>): MutableMap
{ val fs = mutableMapOf
() var clsTmp = cls do { clsTmp.declaredFields.forEach { fs.putIfAbsent(it.name, it) } clsTmp = clsTmp.superclass } while (clsTmp != objCls) return fs } private val objCls = Object::class.java private enum class CopyType { /** * 拷贝所有字段值 */ ALL, /** * 当目标类字段值为null时, 拷贝来源字段值 */ ONLY_DEST_NULL, /** * 当目标类字段值为null或""时, 拷贝来源字段值 */ ONLY_DEST_EMPTY, } } ```
vanki
将自己不安急躁的一面展现给对手,你未战便已经输了三分!
浏览:
5050
创建:
2018-12-25 09:46:51
更新:
2019-02-20 11:45:03
TA的最新笔记
spring-boot配置redis多数据源
linux源修改(阿里)
python安装postgresql依赖
arthas使用
java基于spring的NamedParameterJdbcTemplate封装的获取sql工具类
Impala添加负载
S3常用使用
redis常用操作
hdfs相关命令
crontab使用
TA的最热笔记
java异步http请求工具类(org.asynchttpclient)
iTerm2主题配置与常用技巧
java基于spring.redisTemplate实现分布式锁工具类
Kotlin + SpringBoot + JPA(Hibernate) + Repository自定义方法
IDEA汉化
Sequel Pro连接mysql8打开数据库报错
centos-Hadoop2.7.3完全分布式搭建(HA)
SpringBoot上传文件报错(The temporary upload location [..] is not valid)
mac常用软件
kotlin对象属性值拷贝工具类