Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy—将属性从一个对象绑定到另一个对象_Groovy - Fatal编程技术网

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

Groovy—将属性从一个对象绑定到另一个对象,groovy,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.propert

是否有一种方法可以将一个类的一个实例的属性绑定到另一个类的实例的属性(这两个类之间的公共字段)。请参见下面的示例:

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

结果是一个错误:无法为类:Two设置只读属性:properties。问题是,对于每个对象,
。properties
包括两个内置的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')

// 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

我会按照我的建议选择InvokerHelper.setProperties


我对一般做法感到好奇。我有一个连接到数据仓库的web应用程序。web应用程序的域与来自仓库的表和数据截然不同。我打算在服务层中使用上述技术,但您是否建议增加一个层来负责将遗留对象转换为域对象?这不起作用,因为baz属性没有在一个层上定义。这是否安全地处理
元类
属性?我的意思是,不覆盖它们?@Nikem此方法不会覆盖元类或类<代码>导入org.codehaus.groovy.runtime.InvokerHelper类A{String foo String bar}类B{String foo}A=新A(foo:'foo',bar:'bar')​​​​​​ ​B=new B()use(InvokerHelper){B.setProperties(a.properties)}println B.properties​ // [foo:foo,类别:B类]
use(InvokerHelper) {
    two.setProperties(one.properties)
}