如何在Groovy中合并POJO实例?

Ran*_*ize 1 reflection groovy pojo

鉴于这两个POJO类:

class UserA {
    String name
    String surname
    Integer age
}

class UserB {
    String name
    String surname
    String email
}
Run Code Online (Sandbox Code Playgroud)

和相关实例:

usera = new UserA(name:'john', surname:'smith', age:20)
userb = new UserB(name:'mark', surname:'almond', email:'blah@gmail.com')
Run Code Online (Sandbox Code Playgroud)

如何合并"usera"和"userb"(usera < - userb)以获得"usera",如下所示:

assert usera.name == 'mark'
assert usera.surname == 'almond'
assert usera.age == 20
assert usera.email == 'blah@gmail.com'
Run Code Online (Sandbox Code Playgroud)

通常,我想从其他实例添加缺少的属性和值,并覆盖对象中已存在的属性值.

Wil*_*ill 5

使用metaClass将属性从B添加到A:

class UserA {
    String name
    String surname
    Integer age
}

class UserB {
    String name
    String surname
    String email
}

usera = new UserA(name:'john', surname:'smith', age:20)
userb = new UserB(name:'mark', surname:'almond', email:'blah@gmail.com')

userb.properties.each {
  usera.metaClass[it.key] = it.value
}


assert usera.name == 'mark'
assert usera.surname == 'almond'
assert usera.age == 20
assert usera.email == 'blah@gmail.com'
Run Code Online (Sandbox Code Playgroud)