【问题标题】:Copy a model object in java在java中复制模型对象
【发布时间】:2015-11-16 08:49:26
【问题描述】:

如果我想在 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(),它接受一个模型对象并返回它的副本。首先,我将整个对象序列化为 json,然后再次反序列化以制作副本。但我不确定它是否真的有效。有没有更好的方法来复制普通的旧 java 对象。

【问题讨论】:

    标签: java serialization pojo


    【解决方案1】:

    你可以使用方法:

    BeanUtils.copyProperties(aValue, aLocal);
    

    在 apache commons-beanutils 罐子里

    点击这里commons-beanutils访问apache文档

    【讨论】:

    • 它是否也复制嵌套对象的属性。
    • 抱歉我还没有测试深度克隆,你可以试试。
    【解决方案2】:

    您也可以使用 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> 
    

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

    【讨论】:

      【解决方案3】:

      您可以使用Object.clone()。有一些反对它的论据,但它是可用的。当心,这是一个浅克隆。这取决于您要克隆的类,如果浅克隆就足够了。

      另请参阅此处了解深度克隆建议:Deep clone utility recomendation

      【讨论】:

        【解决方案4】:

        除了上面曾经提到的,你还可以试试ModelMapper。无需配置。在重要的情况下,您可以使用3 matching strategies

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

        【讨论】:

        • 它不复制对象,order和orderDTO被视为同一个对象。
        • 检查所有字段名称和类型是否相同,因为匹配策略需要它。这是一个经过良好测试和广泛使用的库,所以最好在你身边检查一下 Halil。并且在性能上比公认的更好
        猜你喜欢
        • 1970-01-01
        • 2012-08-17
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 2010-10-26
        相关资源
        最近更新 更多