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