最近遇到的一个问题:方法中不想更改传入的Bean参数,想把传入的Bean重新复制一份。

试用了org.apache.commons.beanutils.BeanUtils的cloneBean(bean)方法,发现此方法只能针对单层结构的Bean(Bean中属性的类型是java基本数据类型)起作用。如果Bean中存在自定义的其他Bean类型或者Map、List等数据类型时,此方法只是把这些复杂的类型采用“=”号的形式给新的Bean赋值,此种方式直接把内存地址指向原始Bean中的对应属性了,实际在方法中对这些特殊的属性进行操作时还是会把原始Bean中的值更改。


在网上寻找了一下,发现采用以下方式可避免上面的问题:

/**
 * 对象深度克隆
 *
 * @param srcObj
 *            源对象
 * @return 复制后的新对象
 */
public static Object depthClone(Object srcObj) throws Exception {
    Object cloneObj = null;
    try {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(out);
        oo.writeObject(srcObj);
        ByteArrayInputStream in = new ByteArrayInputStream(
                out.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(in);
        cloneObj = oi.readObject();
    } catch (IOException e) {
        throw new Exception("数据Bean克隆失败!");
    } catch (ClassNotFoundException e) {
        throw new Exception("数据Bean克隆失败!");
    }
    return cloneObj;
}