有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在不同的包中有几个POJO,每个POJO包含来自同一个包的另一个POJO的集合。我需要将包B POJO中所有同名项目复制到包A中的对象

EAX示例:

package com.vanilla.packageA;

public class Student{

    private String firstName;
    private String lastName;
    private Set<Course> 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> course;
    Private Date birtday;

    //getters and setters ommited

}   

package com.vanilla.packageB;

public class Course{
    private String courseName;
    private String courseDescription;
    private <Lecturer> lecturer;
    private Integer hours;

    //seters and getters
} 

我想递归地将PackageB类中的所有项复制到packageA类中,这些类存在于PaCkageB中,并且共享相同的名称

更新:

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


共 (3) 个答案

  1. # 1 楼答案

    如果您已经有了spring依赖项,那么可以使用org.springframework.beans.BeanUtils

    BeanUtils.copyProperties(from, to);
    
  2. # 3 楼答案

    几乎每个项目都需要复制字段值,例如do the clone()。我还认为,实现一些目标是不必要的。只使用一个函数的JAR。我想和大家分享一些我工作的小代码,我在墨水池里留下了一些东西,但总的来说,它可以完成工作。在这种情况下,我使用反射

    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 <T extends Object, Y extends Object> Y deepReflectionObjectCopy(T origin, Class<Y> resultClass) {
        Class<? extends Object> 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;
    }
    

    希望这有帮助