最近遇到的一個問題:方法中不想更改傳入的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; }