在 java 中复制一个模型对象

Copy a model object in java

如果我想在 java 中复制模型对象,最好的方法是什么?因为在 java 中为嵌套对象编写 copy() 函数变得很麻烦。我只是想避免这种情况。作为捷径,我使用这种方法。

    public static <T> T copy(T model, Class<T> tClass) throws Exception {
        final ObjectMapper objectMapper = new ObjectMapper();
        final byte[] bytes = objectMapper.writeValueAsBytes(model);
        final T copy = objectMapper.readValue(bytes, tClass);
        return copy;
    }

然后像这样使用它。

    final McTrack copy = copy(new McTrack(), McTrack.class);

我制作了一个实用函数 copy(),它接受一个模型对象和 returns 它的一个副本。首先,我将整个对象序列化为 json,然后再次反序列化以制作副本。但我不确定它是否真的有效。有没有更好的方法来复制普通的旧 java 对象。

您可以使用 Object.clone()。有一些反对意见,但它是可用的。当心,这是一个浅层克隆。这取决于您要克隆的class,浅克隆是否足够。

另请参阅此处以获得深度克隆建议:Deep clone utility recomendation

你可以使用方法:

BeanUtils.copyProperties(aValue, aLocal);

在 apache 中 commons-beanutils jar

点击此处commons-beanutils访问apache文档

您还可以使用 Dozer 库:http://dozer.sourceforge.net/

您可以像这样轻松地将整个 POJO 复制到另一个:

Mapper mapper = new DozerBeanMapper();
DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);

真正有用的是什么,您可以像这样配置自己的映射:

<mapping>
  <class-a>yourpackage.yourSourceClassName</class-a>
  <class-b>yourpackage.yourDestinationClassName</class-b>
    <field>
      <a>yourSourceFieldName</a>
      <b>yourDestinationFieldName</b>
    </field>
</mapping> 

此外,您可以使用不同的技术来复制对象、使用自定义工厂、特殊 getters/setters 和许多有用的东西:http://dozer.sourceforge.net/documentation/mappings.html

除了上面提到过的,你也可以试试ModelMapper. No configuration is required. In cases where it is important, there are 3 matching strategies你可以用

ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);