没有包名的深拷贝

Deep copy without package names

如何从不同的包中深度复制相同的对象,但具有相同的结构而不进行序列化?

示例:

package com.foo;
class Tree{
    List<Leaf> leaf;
    Int trunk;
}

package com.bar;
class Tree{
    List<Leaf> leaf;
    Int trunk;
}

两者都有更复杂的子对象(ArrayLists 的 ArrayLists)。 这基本上是我通过不同的网络服务接收到的相同对象,因此位于不同的包中。

我希望能够 "map" 同一对象的所有不同版本,例如

选角:com.bar.Tree barTree = (com.foo.Tree) fooTree;

或深拷贝:com.bar.Tree barTree = DeepCopy.(fooTree);

预期结果为 barTree.leaf[k] == fooTree.leaf[k]barTree.trunk==fooTree.trunk

理论上我可以通过反射递归地将所有计算值复制到另一个对象的相应元素(具有相同的名称),但是没有更简单的方法吗?

编辑:更复杂的示例。

您可以在每个 class 中添加所谓的复制构造函数,它接受另一个 class 的实例作为参数,例如:

package com.foo;
class Tree{
    String leaf;
    Int trunk;
    Tree(com.bar.Tree tree){
         this.leaf = tree.leaf;
         this.trunk = tree.trunk;
    }

}

然后您将执行以下操作:

com.bar.Tree barTree = new com.bar.Tree(fooTree);

要复制属性或多或少匹配的不同 classes 的对象,您可以使用像 Dozer or mapstruct 这样的映射库。这些使用起来非常简单,如果 class 结构相似甚至相等(即字段具有相同的名称和类型),则只需几行即可生成并使用这种映射。

使用哪一个由您决定,但 mapstruct 通常似乎更快,因为它不使用反射但在编译时生成 classes。这是两者的比较(尽管我必须承认我不确定它是否有偏见):http://mariusz.wyszomierski.pl/en/mapping-dozer-vs-mapstruct/

公平地说,如果您对两者之一不满意,还有很多其他映射库。