java反射机制创建对象实现:java 深度拷贝 -超完美

java反射机制创建对象实现:java 深度拷贝 -超完美 ,自己做的,下面 

package aop;

public class Student {
	private String name;
	private int  age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

 

package aop;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;

public class DeepCopy {

	/**
     * 深层拷贝
     *
     * @param 
     * @param obj
     * @return
     * @throws Exception
     */
    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")
    private 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 {
                assert baos != null;
                baos.close();
                assert oos != null;
                oos.close();
                assert bais != null;
                bais.close();
                assert ois != null;
                ois.close();
            } catch (Exception e2) {
                //这里报错不需要处理
            }
        }
    }

    /**
     * 是否可以使用json
     * @return
     */
    private static boolean hasJson(){
        try {
            Class.forName("com.alibaba.fastjson.JSONObject");
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 深层拷贝 - 需要net.sf.json.JSONObject
     * @param 
     * @param obj
     * @return
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    private static  T copyByJson(T obj) throws Exception {
    	return (T) JSONObject.parseObject(JSONObject.toJSONString(obj),obj.getClass());
    }
    
    //方法2:最多只做了两层的数组处理:即数组里的数组
    public static void copyObjectSZ(Object[] obj,Object[] objTemp) throws Exception{
		for(int i=0;i){
			    List oTemp = new ArrayList();
		        for (Object o : (List) object)
		        {
		        	Object oT = DeepCopy.copy(o);
		        	oTemp.add(oT);
		        }
				objTemp[i]=oTemp;
			}else if(object instanceof Object[]){
				Object[] objSz=(Object[])object;
				//数组里的每个值的类型一样,创建下标0相同类型的数组对象,否则用Object的数组
				Class c=objSz[0].getClass();
				//创建类数组对象
				Object array=Array.newInstance(c, objSz.length);
		        for (int n=0;n){
				//定义一个新的list
			    List objCopy = new ArrayList();
		        for (Object o : (List) obj){
		        	//循环处理list里的值
		        	//list的每个值直接深度拷贝
		        	Object oc = DeepCopy.copy(o);
		        	objCopy.add(oc);
		        }
		        //赋值到返回值里
		        objReturn=objCopy;
			}else{
				//直接深度拷贝,赋值到返回值里
				objReturn=DeepCopy.copy(obj);
			}
		
    	}
    	return objReturn;
    }
    
    public static void main(String[] args) throws Exception {
    	//map类型值
		Map map=new HashMap();
		map.put("a", "a");
		map.put("b", "b");
		
		//List类型值
		List listS=new ArrayList();
		for(int i=1;i<4;i++){
			listS.add("str"+i);
		}
		
		//Student类对象值
		Student st=new Student();
		st.setName("name0");
		st.setAge(0);
		
		//String象值
		String test="test";
		
		//list值
		List list=new ArrayList();
		for(int i=1;i<4;i++){
			Student s=new Student();
			s.setName("name"+i);
			s.setAge(i);
			list.add(s);
		}
		
		//数组
		Student[] listSz=new Student[3];
		for(int i=0;i值
		obj[2]=st;//Student类对象值
		obj[3]=test;//String象值
		obj[4]=list;//list值
		obj[5]=listSz;//Student[]值

		//打印obj值
		System.out.println("obj值为:");
		for(Object o:obj){
			System.out.println(o.toString());
		}
		
		
		
		//方法2:最多只做了两层的数组处理:即数组里的数组
		Object[] objCopy2=new Object[obj.length];
		//深度拷贝到objCopy
		DeepCopy.copyObjectSZ(obj, objCopy2);

		//方法1:递归深度拷贝到objCopy,完整版
		Object objCopy1=DeepCopy.copyObject(obj);
		Object[] objCopy=(Object[])objCopy1;
		
		//打印objCopy值
		System.out.println("objCopy值为:");
		for(Object o:objCopy){
			System.out.println(o.toString());
		}
		
		//修改objCopy值
		Map mapT=(Map) objCopy[0];
		List listT=(List) objCopy[1];
		Student stuT=(Student) objCopy[2];
		String strT=(String) objCopy[3];
		List listTT=(List) objCopy[4];
		Student[] listSzT=(Student[]) objCopy[5];
		
		String Temp="Temp";
		mapT.put("a", mapT.get("a")+Temp);
		listT.set(0, listT.get(0)+Temp);
		stuT.setName(stuT.getName()+Temp);
		strT=strT+Temp;
		listTT.get(0).setName(listTT.get(0).getName()+Temp);
		listSzT[0].setName(listSzT[0].getName()+Temp);

		//打印objCopy值
		System.out.println("objCopy修改后的值为:");
		for(Object o:objCopy){
			System.out.println(o.toString());
		}
		//打印obj值
		System.out.println("objCopy修改后的obj值为:");
		for(Object ob:obj){
			System.out.println(ob.toString());
		}
		
	}
}



 

你可能感兴趣的:(深度拷贝,java,后端)