程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JAVA 深層拷貝 DeepCopy的應用詳解

JAVA 深層拷貝 DeepCopy的應用詳解

編輯:關於JAVA

JAVA 深層拷貝 DeepCopy的應用詳解。本站提示廣大學習愛好者:(JAVA 深層拷貝 DeepCopy的應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是JAVA 深層拷貝 DeepCopy的應用詳解正文


辦法完成很簡略,供給兩種方法:
一種是序列化成數據流,條件是一切對象(對象中包括的對象...)都須要繼續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辦法就行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved