在下面的Groovy代码中,我将feck
实例的arse
,drink
,Foo
属性的值替换为{{1}实例的值}}
Foo2
有更好的方法吗?我对上面代码的特别关注是属性名称作为字符串存储在列表中,这可能会在(例如)使用重构IDE更改其中一个属性名称时丢失。
答案 0 :(得分:28)
我还没有找到一个排除只读属性(即metaClass,类)的好方法,但是如果你想在Foo实例中设置同样在Foo2实例中的所有属性的值你可以做到以下几点。
class Foo {
def feck = "fe"
def arse = "ar"
def drink = "dr"
}
class Foo2 {
def feck = "fe2"
def arse = "ar2"
def drink = "dr2"
}
def f = new Foo()
def f2 = new Foo2()
f2.properties.each { prop, val ->
if(prop in ["metaClass","class"]) return
if(f.hasProperty(prop)) f[prop] = val
}
assert f.feck == "fe2"
assert f.arse == "ar2"
assert f.drink == "dr2"
答案 1 :(得分:7)
很晚才回答......但是,如果只采用declaredFields
类的非合成 Foo
。使用您的方法:
class Foo {
def feck = "fe"
def arse = "ar"
def drink = "dr"
}
class Foo2 {
def feck = "fe2"
def arse = "ar2"
def drink = "dr2"
}
def f = new Foo()
def f2 = new Foo2()
Foo.declaredFields.findAll { !it.synthetic }*.name.each {it ->
f[it] = f2[it]
}
assert f.feck == "fe2"
assert f.arse == "ar2"
assert f.drink == "dr2"
如果在重构中发生了某些变化,例如在Foo
但未在Foo2
中,则会从此代码中抛出Exception
,告知出现问题。