假设我们有一个像这样定义的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?
我的问题略有不同,我正在处理两个不同的对象,这两个对象只是共享相同的属性但不完全!
答案 0 :(得分:5)
答案 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);