麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

JAVA 深層拷貝 DeepCopy的使用詳解

2019-11-26 16:01:53
字體:
供稿:網(wǎng)友

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

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

復(fù)制代碼 代碼如下:

    public class DeepCopy { 
        /**
         * 深層拷貝
         * 
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        public static <T> T copy(T obj) throws Exception { 
            //是否實(shí)現(xiàn)了序列化接口,即使該類實(shí)現(xiàn)了,他擁有的對象未必也有... 
            if(Serializable.class.isAssignableFrom(obj.getClass())){ 
                //如果子類沒有繼承該接口,這一步會報(bào)錯(cuò) 
                try { 
                    return copyImplSerializable(obj); 
                } catch (Exception e) { 
                    //這里不處理,會運(yùn)行到下面的嘗試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; 
            //如果子類沒有繼承該接口,這一步會報(bào)錯(cuò) 
            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) { 
                    //這里報(bào)錯(cuò)不需要處理 
                } 
            } 
        } 

        /**
         * 是否可以使用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()); 
        } 
    } 

只需要調(diào)用copy方法就行。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 刘亦菲一区二区三区免费看 | 久久精品无码一区二区三区 | 国产亚洲精品久久午夜玫瑰园 | 国产一区二区三区视频在线 | 成人性视频在线 | 国产精品99久久久久久久女警 | 黄色网址进入 | 欧美在线观看黄色 | 密室逃脱第一季免费观看完整在线 | 国产精品久久久久久久久久三级 | 国产999视频在线观看 | 香蕉国产在线视频 | 亚洲精品午夜国产va久久成人 | 一区二区三区欧美在线 | 毛片视频网站在线观看 | 欧美日本一区二区 | 欧美偷拍一区二区 | 成人在线视频一区 | 国产在线一区二区三区 | 内地av在线 | av日韩一区二区 | 午夜精品在线视频 | 午夜精品老牛av一区二区三区 | 亚洲一区二区不卡视频 | 国产成人小视频在线观看 | 久久精品高清 | 色播视频在线播放 | 成年人在线视频免费 | 午夜视频导航 | 成人国产精品一区二区毛片在线 | 操碰在线视频 | 久久不射电影网 | 黄色高清免费网站 | 最新一级毛片 | 国产1区2区3区在线观看 | 亚州欧美在线 | 精品黑人一区二区三区国语馆 | 最新中文在线视频 | 精品国产一区在线观看 | 欧美日韩大片在线观看 | 国产精品99久久久久久董美香 |