在Groovy代码下面我取代的值feck
,arse
,drink
的一个实例的特性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()
["feck", "arse", "drink"].each {it ->
f."$it" = f2."$it"
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?我对上面代码的特别关注是属性名称作为字符串存储在列表中,这可能会在(例如)使用重构IDE更改其中一个属性名称时丢失.
Joh*_*ner 31
我还没有找到一个很好的方法来排除只读属性(即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"
Run Code Online (Sandbox Code Playgroud)
答案很晚......然而,只采取非合成 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"
Run Code Online (Sandbox Code Playgroud)
如果在重构中发生了某些变化,例如Foo
但在其中,Foo2
那么Exception
将会从此代码中抛出一些建议,说明出现了问题.
归档时间: |
|
查看次数: |
26560 次 |
最近记录: |