Maison >Java >javaDidacticiel >Explication détaillée de l'utilisation de la copie profonde JAVA DeepCopy

Explication détaillée de l'utilisation de la copie profonde JAVA DeepCopy

高洛峰
高洛峰original
2017-01-19 11:29:361955parcourir

L'implémentation de la méthode est très simple et propose deux méthodes :
La première consiste à sérialiser dans un flux de données. Le principe est que tous les objets (objets inclus dans l'objet...) doivent hériter de l'interface If. ils héritent tous, ce sera très difficile. S'il n'y a pas d'héritage et que vous ne prévoyez pas de modifier toutes les classes, vous pouvez utiliser la deuxième méthode.

La seconde consiste à sérialiser l'objet en json et à le copier via json. Cette méthode nécessite l'utilisation de net.sf.json.JSONObject.
Le code spécifique est le suivant :

    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());  
        }  
    }

Appelez simplement la méthode de copie.

Pour des articles plus détaillés sur la copie profonde JAVA DeepCopy, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn