如何从不同的包中深度复制相同的对象,但具有相同的结构而不进行序列化?
例:
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
。从理论上讲,我可以通过反射将所有线索递归复制到另一个对象的对应元素(具有相同名称),但是难道没有更简单的方法吗?
编辑:更复杂的例子。
最佳答案
要复制属性或多或少匹配的不同类的对象,可以使用诸如Dozer或mapstruct之类的映射库。它们非常易于使用,并且如果类结构相似或什至相等(即字段具有相同的名称和类型),则生成映射并仅用几行即可使用。
使用哪种方法取决于您,但是mapstruct似乎通常更快,因为它不使用反射而是在编译时生成类。这是两者的比较(尽管我必须承认我不确定是否有偏见):http://mariusz.wyszomierski.pl/en/mapping-dozer-vs-mapstruct/
公平地说,如果您对这两个库之一不满意,那么还有许多其他的映射库。