复制Groovy类属性
发布时间:2020-12-14 16:35:31 所属栏目:大数据 来源:网络整理
导读:我想通过一般的方式将对象属性复制到另一个对象(如果一个属性存在于目标对象上,我将从源对象中复制它). 我的代码工作正常使用ExpandoMetaClass,但我不喜欢的解决方案.还有其他方法吗? class User { String name = 'Arturo' String city = 'Madrid' Integer
我想通过一般的方式将对象属性复制到另一个对象(如果一个属性存在于目标对象上,我将从源对象中复制它).
我的代码工作正常使用ExpandoMetaClass,但我不喜欢的解决方案.还有其他方法吗? class User { String name = 'Arturo' String city = 'Madrid' Integer age = 27 } class AdminUser { String name String city Integer age } def copyProperties(source,target) { target.properties.each { key,value -> if (source.metaClass.hasProperty(source,key) && key != 'class' && key != 'metaClass') { target.setProperty(key,source.metaClass.getProperty(source,key)) } } } def (user,adminUser) = [new User(),new AdminUser()] assert adminUser.name == null assert adminUser.city == null assert adminUser.age == null copyProperties(user,adminUser) assert adminUser.name == 'Arturo' assert adminUser.city == 'Madrid' assert adminUser.age == 27 解决方法
我认为你的解决方案是非常好的,是在正确的轨道.至少我觉得很容易理解.
该解决方案的更多的succint版本可能是… def copyProperties(source,target) { source.properties.each { key,value -> if (target.hasProperty(key) && !(key in ['class','metaClass'])) target[key] = value } } …但并没有根本的不同.我正在迭代源属性,所以我可以使用值分配给目标:).它可能比原来的解决方案不那么强大,因为我认为如果目标对象定义了一个getAt(String)方法,它将会破坏. 如果你想得到这个想法,你可能会这样做: def copyProperties(source,target) { def (sProps,tProps) = [source,target]*.properties*.keySet() def commonProps = sProps.intersect(tProps) - ['class','metaClass'] commonProps.each { target[it] = source[it] } } 基本上,它首先计算两个对象之间的公共属性,然后复制它们.它也有效,但我认为第一个更直接,更容易理解:) 有时少是多. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |