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

例:

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




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


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

我希望能够将所有不同版本“映射”到同一对象,例如

投放:com.bar.Tree barTree = (com.foo.Tree) fooTree;

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

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

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

编辑:更复杂的例子。

最佳答案

要复制属性或多或少匹配的不同类的对象,可以使用诸如Dozermapstruct之类的映射库。它们非常易于使用,并且如果类结构相似或什至相等(即字段具有相同的名称和类型),则生成映射并仅用几行即可使用。

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

公平地说,如果您对这两个库之一不满意,那么还有许多其他的映射库。

10-04 18:11