Groovy属性迭代

Dón*_*nal 28 groovy

在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)


alb*_*iff 9

答案很晚......然而,只采取非合成 declaredFieldsFoo类.使用您的方法:

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将会从此代码中抛出一些建议,说明出现了问题.