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)
}