熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JAVA 深層拷貝 DeepCopy的使用詳解

2013-11-15 12:01:12  來源: JSP教程 
最近需要用到比較兩個對象屬性的變化其中一個是oldObj另外一個是newObjoldObj是newObj的前一個狀態所以需要在newObj的某個狀態時復制一個一樣的對象由於JAVA不支持深層拷貝因此專門寫了一個方法  

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

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

復制代碼 代碼如下:
    public class DeepCopy { 
        /**
         * 深層拷貝
         * 
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        public static <T> T copy(T obj) throws Exception { 
            //是否實現了序列化接口即使該類實現了他擁有的對象未必也有 
            if(SerializableclassisAssignableFrom(objgetClass())){ 
                //如果子類沒有繼承該接口這一步會報錯 
                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); 
                ooswriteObject(obj); 
                bais = new ByteArrayInputStream(baostoByteArray()); 
                ois = new ObjectInputStream(bais); 

                o = oisreadObject(); 
                return (T) o; 
            } catch (Exception e) { 
                throw new Exception("對象中包含沒有繼承序列化的對象"); 
            } finally{ 
                try { 
                    baosclose(); 
                    oosclose(); 
                    baisclose(); 
                    oisclose(); 
                } catch (Exception e) { 
                    //這裡報錯不需要處理 
                } 
            } 
        } 

        /**
         * 是否可以使用json
         * @return
         */ 
        private static boolean hasJson(){ 
            try { 
                ClassforName("netsfjsonJSONObject"); 
                return true; 
            } catch (Exception e) { 
                return false; 
            } 
        } 

        /**
         * 深層拷貝 需要netsfjsonJSONObject
         * @param <T>
         * @param obj
         * @return
         * @throws Exception
         */ 
        @SuppressWarnings("unchecked") 
        public static <T> T copyByJson(T obj) throws Exception { 
            return (T)JSONObjecttoBean(JSONObjectfromObject(obj)objgetClass()); 
        } 
    } 

  
只需要調用copy方法就行


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20101.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.