對象複製(克隆)--深度複製

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章