Groovy - 将属性从一个对象绑定到另一个对象

vv.*_*vv. 4 groovy

有没有办法将属性从一个类的实例绑定到另一个类的实例的属性(两者之间的公共字段).请参阅以下示例:

class One {
  String foo
  String bar
}

class Two {
  String foo
  String bar
  String baz
}

def one = new One(foo:'one-foo', bar:'one-bar')
def two = new Two()

two.properties = one.properties

assert "one-foo" == two.foo
assert "one-bar" == two.bar
assert !two.baz
Run Code Online (Sandbox Code Playgroud)

结果是一个错误:无法设置readonly属性:class的属性:Two

Mic*_*d a 9

我会选择InvokerHelper.setProperties我suggesed 这里.

use(InvokerHelper) {
    two.setProperties(one.properties)
}
Run Code Online (Sandbox Code Playgroud)


Dón*_*nal 6

问题是对于每个对象,.properties包括两个内置的Groovy定义的属性,这些是metaClassclass.您要做的只是设置用户定义的属性.您可以使用如下所示的代码轻松完成此操作:

class One {
  String foo
  String bar
}

class Two {
  String foo
  String bar
  String baz
}

def one = new One(foo:'one-foo', bar:'one-bar')

// You'll probably want to define a helper method that does the following 3 lines for any Groovy object
def propsMap = one.properties
propsMap.remove('metaClass')
propsMap.remove('class')

def two = new Two(propsMap)

assert "one-foo" == two.foo
assert "one-bar" == two.bar
assert !two.baz
Run Code Online (Sandbox Code Playgroud)