JAVA - 如何将对象的属性复制到具有相同属性的另一个对象?

时间:2016-03-24 09:09:09

标签: java object copy

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

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

出于某种原因,我需要创建第二个对象B,其中只包含对象A的前两个属性:

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

所以我的问题是:将对象A复制到对象B的最佳方法是什么? 我一直在通过getter和setter来复制属性,但有些东西告诉我必须有更好的方法来做到这一点!特别是当对象具有很多属性时,我必须编写行和代码行才能将它们全部复制到第二个对象B ...

非常感谢:)

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

我的问题略有不同,我正在处理两个不同的对象,这两个对象只是共享相同的属性但不完全!

3 个答案:

答案 0 :(得分:5)

尝试DozerBeanUtils

等库

答案 1 :(得分:5)

扩展我的评论:

使用Dozer可以像以下一样简单:

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

或者如果你的目标类没有no-arg构造函数:

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

来自文档(我强调):

  

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

答案 2 :(得分:2)

你需要的是对象映射器。尝试 Orika 推土机。 对象不必是相同类型。如果映射找到相同名称和类型的属性,则会自动映射它。

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);