【问题标题】:How to assign all matching properties from Groovy object to Java object?如何将 Groovy 对象中的所有匹配属性分配给 Java 对象?
【发布时间】:2011-08-24 01:51:22
【问题描述】:
我想使用带有 JDBC 的 Groovy 从表中加载一些数据。然后,我想将属性复制到属性名称匹配的位置。我如何在 Groovy 中做到这一点?
类似这样的:
sql.eachRow("select * from temp_table") {
def e = new MyJavaClass()
// copy matching fields from it to e
}
【问题讨论】:
标签:
groovy
properties
javabeans
【解决方案1】:
除了 topchef 的回答之外,您也许可以使用一些 groovy 地图魔术
如果您将 sql 限制为 Java 类中的属性(并假设您可以一次将整个结果保存在内存中),那么您应该能够使用 rows 方法来获得 List 的 @ 987654324@ 个对象(每行一个)。由于这个类是Map 的一个实例,groovy 会为你使用它来construct your java object automatically:
class MyJavaClass {
String property1, property2, property3
}
sql.rows("select property1, property2, property3 from temp_table").each { row ->
MyJavaClass e = row
}
【解决方案2】:
一些绝妙的魔法会有所帮助:
def filtered = ['property1', 'property2', ....]
sql.eachRow("select * from temp_table") {
def e = new MyJavaClass(it.properties.findAll{filtered.contains(it.key)})
}
鉴于
- list
filtered 包含您要复制的所有属性名称;
- 您的表列名称对应于
MyJavaClass 声明的属性名称(与列表中的filtered 相同);
-
MyJavaClass 同时具有默认(空)构造函数和构造函数
将所有属性作为参数;
-
MyJavaClass 声明属性的公共设置器;
例如:
public MyJavaClass() {}
public MyJavaClass(String property1, String property2, ....) {
this.property1 = property1;
this.property2 = property2;
.... }
public void setProperty1(String property1) {this.property1 = property1;}
public void setProperty2(String property2) {this.property2 = property2;}
....
您可以使用filtered 作为不需要的属性列表,如下所示:
def filtered = ['class', 'metaClass', ....]
然后:
def e = new MyJavaClass(it.properties.findAll{!filtered.contains(it.key)})