java对象的克隆以及属性之间的克隆操作

常用的类
apache下beanutils工具类
org.apache.commons.beanutils.BeanUtils

/**
     * 复制对象obj,类似于值传递,非引用
     */
    private Object cloneObject(Object obj) throws Exception {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(obj);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        return in.readObject();
    }


/**
     * 比较同一类型class,orig 中非NULL值的属性和dest不同的值到resultBean里面
     * 
     * @param dest 要比较的BEAN
     * @param orig 原来BEAN
     * @param result 结果BEAN
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static void differBeanNotNullPropertyToOtherBean(Object dest, Object orig , Object result) throws IllegalAccessException,
            InvocationTargetException {
        // Validate existence of the specified beans
        if (dest == null) {
            throw new IllegalArgumentException("No destination bean specified");
        }
        if (orig == null) {
            throw new IllegalArgumentException("No origin bean specified");
        }
        if (result == null) {
            throw new IllegalArgumentException("No result bean specified");
        }
        
        if (!dest.getClass().toString().equals(orig.getClass().toString())) {
            throw new IllegalArgumentException("No same bean class");
        }
        if (orig instanceof Map) {
            throw new IllegalArgumentException("No support map");
        }

        /* if (orig is a standard JavaBean) */
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);
        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();
            if ("class".equals(name)) {
                continue; // No point in trying to set an object's class
            }
            if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(dest, name)) {
                try {
                    Object value1 = PropertyUtils.getSimpleProperty(orig, name);
                    Object value2 = PropertyUtils.getSimpleProperty(dest, name);
                    if (value2 != null && !value2.equals(value1)) {
                         if (PropertyUtils.isReadable(result, name) && PropertyUtils.isWriteable(result, name)) {
                             BeanUtils.copyProperty(result, name, value2);
                         }
                    }
                } catch (NoSuchMethodException e) {
                }
            }
        }

    }
    
    /**
     * 比较一个对象,如是这个对象的某一个属性不为空,把他copy到另一个有这个属性的bean中
     * 
     * @param result 要copy到的bean
     * @param orig 原来BEAN
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static void copyOrigNotNullPropertyToDestBean(Object result, Object orig) throws IllegalAccessException,
            InvocationTargetException {
        // Validate existence of the specified beans
        if (result == null) {
            throw new IllegalArgumentException("No destination bean specified");
        }
        if (orig == null) {
            throw new IllegalArgumentException("No origin bean specified");
        }
        
        if (orig instanceof Map) {
            throw new IllegalArgumentException("No support map");
        }

        /* if (orig is a standard JavaBean) */
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);
        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();
            if ("class".equals(name)) {
                continue; // No point in trying to set an object's class
            }
            if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(result, name)) {
                try {
                    Object value1 = PropertyUtils.getSimpleProperty(orig, name);
                    if (value1 != null) {
                         if (PropertyUtils.isReadable(result, name) && PropertyUtils.isWriteable(result, name)) {
                             BeanUtils.copyProperty(result, name, value1);
                         }
                    }
                } catch (NoSuchMethodException e) {
                }
            }
        }

    }

你可能感兴趣的:(java,apache,bean)