JAVA 심층 복사 DeepCopy 사용 에 대한 상세 설명

방법 은 간단 합 니 다.두 가지 방식 을 제공 합 니 다.하 나 는 데이터 흐름 으로 직렬 화 되 는 것 입 니 다.전 제 는 모든 대상(대상 에 포 함 된 대상..)이 Serializable 인 터 페 이 스 를 계승 해 야 합 니 다.모두 계승 하면 쉽 습 니 다.계승 이 없 으 면 모든 종 류 를 수정 하지 않 고 두 번 째 방식 으로 할 수 있 습 니 다.두 번 째 는 대상 을 json 으로 서열 화하 고 json 을 통 해 복사 하 는 것 이다.이런 방식 은 net.sf.json.JSONobject 를 사용 해 야 한다.구체 적 인 코드 는 다음 과 같다.
 
  
    public class DeepCopy { 
        /**
         *
         * 
         * @param
         * @param obj
         * @return
         * @throws Exception
         */ 
        public static 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
         * @param obj
         * @return
         * @throws Exception
         */ 
        @SuppressWarnings("unchecked") 
        public static 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
         * @param obj
         * @return
         * @throws Exception
         */ 
        @SuppressWarnings("unchecked") 
        public static T copyByJson(T obj) throws Exception { 
            return (T)JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass()); 
        } 
    } 

copy 방법 만 호출 하면 됩 니 다.

좋은 웹페이지 즐겨찾기