Другим способом является:
def copyProperties( source, target ) {
[source,target]*.getClass().declaredFields*.grep { !it.synthetic }.name.with { a, b ->
a.intersect( b ).each {
target."$it" = source."$it"
}
}
}
, который получает общие свойства (не являющиеся синтетическими полями), а затем назначает их цели
Вы также можете(используя этот метод) сделайте что-то вроде:
def user = new User()
def propCopy( src, clazz ) {
[src.getClass(), clazz].declaredFields*.grep { !it.synthetic }.name.with { a, b ->
clazz.newInstance().with { tgt ->
a.intersect( b ).each {
tgt[ it ] = src[ it ]
}
tgt
}
}
}
def admin = propCopy( user, AdminUser )
assert admin.name == 'Arturo'
assert admin.city == 'Madrid'
assert admin.age == 27
Таким образом, вы передаете методу объект, из которого копируются свойства, и класс возвращаемого объекта.Затем метод создает новый экземпляр этого класса (в предположении конструктора без аргументов), устанавливает свойства и возвращает его.
Edit 2
Предполагая, что это классы Groovy, выможет вызвать конструктор Map
и установить все общие свойства следующим образом:
def propCopy( src, clazz ) {
[src.getClass(), clazz].declaredFields*.grep { !it.synthetic }.name.with { a, b ->
clazz.metaClass.invokeConstructor( a.intersect( b ).collectEntries { [ (it):src[ it ] ] } )
}
}