Copie Groovy des propriétés de la classe

Je veux copier les propriétés d'un objet à un autre objet de manière générique (si une propriété existe sur l'objet cible, je l'ai copier à partir de la source de l'objet).

Mon code fonctionne à l'aide de ExpandoMetaClass, mais je n'aime pas la solution. Existe-il d'autres façons de le faire?

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
Vous pouvez toujours utiliser BeanUtils.
Pas sûr BeanUtils fonctionnera comme la source et la destination sont différentes classes...
Connexes: Groovy - lier les propriétés d'un objet à un autre
Que penser de l'utilisation de la AutoClone annotation? groovy.codehaus.org/gapi/groovy/transform/AutoClone.html

OriginalL'auteur Arturo Herrero | 2012-01-30