Java反射实现深拷贝(不完善)

Java反射实现深拷贝(不完善)

最近遇到深浅拷贝的知识点,大概网上的主流方式都是重写clone()函数,或者引用第三方库或者序列化之类的,我思考能否用反射来实现深拷贝呢?而且clone()对于对象里面的对象,是再进行一次对里面对象的clone,那假设这个里面的对象里面还有对象呢?感觉还是不太行。。。。

这里就是通过反射实现了对基本数据类型和Collection的深拷贝,当这个对象里出现Map、String、数组等类型时依旧会出问题。。。所以还需要很多补充,就是在if里面再写else if。。。感觉好像还是序列化方便点?

就当是温习了一下反射的知识点吧

package com.ldl.test;
import java.lang.reflect.*;
import java.util.*;
import java.util.HashMap;
import java.lang.Class;
//-Xms10m -Xms10m -XX:+PrintGCDetails
class Demo {
    Obj1 obj1;

    ArrayList<Obj2> list;
    int b;
}
class  Obj1{
    private int a;
    final int c=3;
    Obj2 obj2;
    Obj1(int a){
        this.a=a;
    }
    Obj1(){
    }
}
class  Obj2{
    int b;
    Obj2(int b){
        this.b=b;
    }
    Obj2(){
    }
}
public class Main{
    List<String> res= new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    boolean flag=false;
    public static void main(String[] args) throws Exception {
        Main main = new Main();
        int[] a = new int[5];
        Demo demo = new Demo();
        demo.b=1;
        Obj1 obj1 = new Obj1(2);
        Obj2 obj2 = new Obj2(3);
        demo.obj1 = obj1;demo.obj1.obj2=obj2;
        ArrayList<Obj2> list = new ArrayList<Obj2>(); list.add(new Obj2(4));list.add(new Obj2(5));
        demo.list=list;
        Demo res = (Demo)main.DeepClone(demo);
        for(Obj2 x : res.list){
            System.out.println(x.b);
        }
        System.out.println(res.obj1.c);
    }
    public <T>T DeepClone(T demo) throws Exception{
        T clone = (T)demo.getClass().newInstance();
        Field[] fields = demo.getClass().getDeclaredFields();
        for(Field field:fields){
            field.setAccessible(true);
            Object o1 = field.get(demo);
            if(!field.getType().isPrimitive()){
                //是对象
                //判断是否为集合类型
                if(o1 instanceof Collection){
                    Iterator iterator = ((Collection) o1).iterator();
                    Object x = (Collection)o1.getClass().newInstance();
                    while (iterator.hasNext()){
                        Object temp = iterator.next();
                        ((Collection) x).add(DeepClone(temp));
                    }
                    field.set(clone,x);
                }else {
                    field.set(clone,DeepClone(field.get(demo)));
                }
            }else {
                //是基本类型
                field.set(clone,o1);
            }
        }
        return clone;
    }
}
posted @ 2022-09-23 18:35  杀戒之声  阅读(165)  评论(0编辑  收藏  举报