国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JAVA 深層拷貝 DeepCopy的使用詳解

2019-11-26 16:01:53
字體:
來源:轉載
供稿:網友

方法實現很簡單,提供兩種方式:
一種是序列化成數據流,前提是所有對象(對象中包含的對象...)都需要繼承Serializable接口,如果都繼承了那很容易,如果沒有繼承,而且也不打算修改所有類,可以用第二種方式。

第二種是將對象序列化為json,通過json來實現拷貝,這種方式需要用到net.sf.json.JSONObject。
具體代碼如下:

復制代碼 代碼如下:

    public class DeepCopy { 
        /**
         * 深層拷貝
         * 
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        public static <T> T copy(T obj) throws Exception { 
            //是否實現了序列化接口,即使該類實現了,他擁有的對象未必也有... 
            if(Serializable.class.isAssignableFrom(obj.getClass())){ 
                //如果子類沒有繼承該接口,這一步會報錯 
                try { 
                    return copyImplSerializable(obj); 
                } catch (Exception e) { 
                    //這里不處理,會運行到下面的嘗試json 
                } 
            } 
            //如果序列化失敗,嘗試json序列化方式 
            if(hasJson()){ 
                try { 
                    return copyByJson(obj); 
                } catch (Exception e) { 
                    //這里不處理,下面返回null 
                } 
            } 
            return null; 
        } 

        /**
         * 深層拷貝 - 需要類繼承序列化接口
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        @SuppressWarnings("unchecked") 
        public static <T> T copyImplSerializable(T obj) throws Exception { 
            ByteArrayOutputStream baos = null; 
            ObjectOutputStream oos = null; 

            ByteArrayInputStream bais = null; 
            ObjectInputStream ois = null; 

            Object o = null; 
            //如果子類沒有繼承該接口,這一步會報錯 
            try { 
                baos = new ByteArrayOutputStream(); 
                oos = new ObjectOutputStream(baos); 
                oos.writeObject(obj); 
                bais = new ByteArrayInputStream(baos.toByteArray()); 
                ois = new ObjectInputStream(bais); 

                o = ois.readObject(); 
                return (T) o; 
            } catch (Exception e) { 
                throw new Exception("對象中包含沒有繼承序列化的對象"); 
            } finally{ 
                try { 
                    baos.close(); 
                    oos.close(); 
                    bais.close(); 
                    ois.close(); 
                } catch (Exception e2) { 
                    //這里報錯不需要處理 
                } 
            } 
        } 

        /**
         * 是否可以使用json
         * @return
         */ 
        private static boolean hasJson(){ 
            try { 
                Class.forName("net.sf.json.JSONObject"); 
                return true; 
            } catch (Exception e) { 
                return false; 
            } 
        } 

        /**
         * 深層拷貝 - 需要net.sf.json.JSONObject
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        @SuppressWarnings("unchecked") 
        public static <T> T copyByJson(T obj) throws Exception { 
            return (T)JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass()); 
        } 
    } 

只需要調用copy方法就行。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邛崃市| 云和县| 安福县| 资中县| 沧州市| 个旧市| 平远县| 桓仁| 三河市| 睢宁县| 陆丰市| 奎屯市| 栖霞市| 江山市| 黑河市| 灵川县| 瑞金市| 福安市| 尚义县| 皋兰县| 原阳县| 东乡县| 迭部县| 盱眙县| 宝丰县| 阜新市| 农安县| 临澧县| 龙岩市| 兴宁市| 沂源县| 方正县| 平乐县| 内黄县| 龙江县| 聂拉木县| 那坡县| 南平市| 上蔡县| 辰溪县| 敦煌市|