将POJO内容从一个bean复制到另一个bean

我在不同的包中有很少的Pojos,每个POJO包含来自同一个包的另一个pojo的集合。 我需要将Package B Pojos中具有相同名称的所有项目复制到Package A中的对象。

Eaxmple:

package com.vanilla.packageA; public class Student{ private String firstName; private String lastName; private Set course; //getters and setters ommited } 

 package com.vanilla.packageA; public class Course{ private String courseName; private String courseDescription; //seters and getters } 

 package com.vanilla.packageB; public class Student{ private String firstName; private String lastName; private Address address; private Set course; Private Date birtday; //getters and setters ommited } 

 package com.vanilla.packageB; public class Course{ private String courseName; private String courseDescription; private  lecturer; private Integer hours; //seters and getters } 

我想递归地将PackageB类中的所有项复制到PackageB中存在的packageA类并共享相同的名称。

更新:

伙计们,我知道这是一个愚蠢的问题,但我需要维护这段代码,现在代码编写的方式是他们必须调用50个getter和setter,或者用50个参数调用构造函数。 不幸的是,我不能使用相同的对象,我需要复制它,但我必须找到更多“优雅”的方式来复制tese bean。

Apache BeanUtils.copyProperties不起作用的原因是什么?

好吧.. 推土机可能就是你想要的东西。

。 。 。 它是对象映射框架的对象。 这个想法是:

  • 通常它会按照惯例进行映射。
  • 您可以使用映射文件覆盖此约定。

。 。 因此映射文件尽可能紧凑。 它在许多情况下很有用,例如将用例指定服务有效负载映射到可重用的核心模型对象。

在提供SpringSource培训课程时,我们经常指出这个框架。

请参阅mapstruct 。 这个工具生成代码,因此reflection没有开销。

几乎每个项目都需要复制字段值,例如clone()。 我还认为,为了完成一些目标,没有必要导入.jars只使用一个函数。 我想分享一些我工作的小代码,有些东西我留在墨水池中,但总的来说它做的工作。 在这种情况下,我使用reflection。

 public class ObjectCopyTools { static String[] bases = new String[] {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; static String[] equivalents = new String[] {"Byte", "Short", "Integer", "Long", "Float", "Double", "Character", "Boolean"}; static { } private static boolean areEquivalents(String type1, String type2){ for (int i = 0; i < bases.length; i++) { if((type1.equals(bases[i]) && type2.equals(equivalents[i])) || (type2.equals(bases[i]) && type1.equals(equivalents[i]))){ return true; } } return false; } public static  Y deepReflectionObjectCopy(T origin, Class resultClass) { Class origClass = origin.getClass(); Y resultObject = null; for (Constructor constructor : resultClass.getConstructors()) { if (constructor.getParameterCount() == 0) { try { resultObject = (Y) constructor.newInstance(); }catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { } break; } } if(resultObject == null){ return null; } Field[] origFields = origClass.getDeclaredFields(); Field[] destFields = resultObject.getClass().getDeclaredFields(); Object value = null; for(Field dstField: destFields){ try { Field tempOrigField = origClass.getDeclaredField(dstField.getName()); if(tempOrigField.getType().equals(dstField.getType()) || areEquivalents(tempOrigField.getType().getSimpleName(), dstField.getType().getSimpleName())){ dstField.set(resultObject, tempOrigField.get(origin)); } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { } } return resultObject; } 

希望这有帮助。

如果DRY是计算机科学的基本原则,那么你可以给出两个相同的并行对象图的原因是什么? 您不仅增加了维护负担一倍,而且现在您必须开发一种递归方法,除了将数据从一个传送到另一个之外什么也不做。