最近遇到的一个问题:方法中不想更改传入的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; }