Groovy属性迭代

时间:2009-09-25 14:41:23

标签: groovy

在下面的Groovy代码中,我将feck实例的arsedrinkFoo属性的值替换为{{1}实例的值}}

Foo2

有更好的方法吗?我对上面代码的特别关注是属性名称作为字符串存储在列表中,这可能会在(例如)使用重构IDE更改其中一个属性名称时丢失。

2 个答案:

答案 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,告知出现问题。