【问题标题】:JAVA - How to copy attributes of an object to another object having the same attributes?JAVA - 如何将对象的属性复制到具有相同属性的另一个对象?
【发布时间】:2016-03-24 09:09:08
【问题描述】:

假设我们有一个像这样定义的对象 A:

public class ObjectA {
    private Attribute a1;
    private Attribute a2;
    private Attribute a3;
}

出于某种原因,我需要使用对象 A 的前两个属性创建第二个对象 B:

public class ObjectB {
    private Attribute a1;
    private Attribute a2;
}

所以我的问题是:将 Object A 复制到 Object B 的最佳方法是什么? 我一直在逐个复制 getter 和 setter 的属性,但有些事情告诉我必须有更好的方法来做到这一点!尤其是当对象会有很多属性的时候,我只好写一行行的代码,把它们全部复制到第二个Object B中……

非常感谢:)

编辑:“可能与另一个问题重复”提醒我:How do I copy an object in Java?

我的问题略有不同,因为我正在处理 2 个不同的对象,它们只是共享相同的属性但不完全!

【问题讨论】:

  • 看看使用反射的 Apache commons BeanUtils:commons.apache.org/proper/commons-beanutils
  • Berger 和 Tom,谢谢,我会在这些链接中获得战利品! @hahn 我的问题有点愚蠢吗? ^^'
  • 我同意这不是复制对象,而是在不同层次结构中的对象之间复制(部分)数据。 Dozer 是一个很好的工具,因为它可以自动处理常见的属性(相同的名称和类型),而无需编写任何额外的行。

标签: java object copy


【解决方案1】:

扩展我的评论:

使用推土机可以很简单:

Mapper mapper = new DozerBeanMapper();
ObjectA source = new ObjectA();
ObjectB target = mapper.map(source , ObjectB.class);

或者如果您的目标类没有无参数构造函数:

ObjectA source = new ObjectA();
ObjectB target = new ObjectB(/*args*/);
mapper.map(source, target );

来自文档(我强调):

执行推土机映射后,结果将是目标对象的新实例,其中包含与源对象具有相同字段名称的所有字段的值。如果任何映射的属性属于不同的数据类型,Dozer 映射引擎将自动进行数据类型转换。

【讨论】:

  • 这看起来非常接近我正在寻找的东西。 Dozer 是否也处理父属性?现在假设对象 A 正在扩展对象 C,该对象 C 具有我想复制到对象 B 的属性 a4 的属性 a4 ?
  • @HyukchanKwon 如果 ObjectB 也具有属性 a4,那么是的,它应该被复制。在大多数现实世界的应用程序中,映射并不是那么容易,即您可能需要为非平凡的映射提供一些代码(如只读、自定义类型转换、不同名称等)。
  • 谢谢@Thomas :) 我试试看!
  • 我尝试了 Doze 和基本的映射,它只需要几行代码就非常棒!谢谢:)
【解决方案2】:

试试DozerBeanUtils 之类的库

【讨论】:

    【解决方案3】:

    您需要的是对象映射器。试试 OrikaDozer。 对象不必是同一类型。在映射时,如果它找到相同名称和类型的属性,它会自动映射它。

    MapperFacade mapper = mapperFactory.getMapperFacade();
    UserDTO userDTO = new UserDTO();
    userDTO.setName("xyz");
    ..
    User user = mapper.map(userDTO, User.class);
    

    如果必须映射不同的属性名称,您也可以自定义。

    MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
    mapperFactory.classMap(UserDTO.class, User.class)
                .field("name", "username")
                .byDefault().register();
    mapper = mapperFactory.getMapperFacade();
    ...
    User user = mapper.map(userDTO, User.class);
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2017-05-08
      • 2016-07-18
      • 2014-12-15
      • 1970-01-01
      • 2016-09-20
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多