Apache BeanUtils
- 深拷贝与浅拷贝
- Apache BeanUtils常用的三个方法
- copyProperties(Object to, Object from):void
- deacribe(Object bean):Map
- populate(Object bean, Map):void
一:深拷贝与浅拷贝
相关文章:
Java - 【序列化】序列化与克隆
测试用例:
import java.io.*;public class Test {public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {String name = "小明";String gender = "男";int age = 10;String[] cards = new String[]{"建设银行","中国银行"};Person p1 = new Person(name,gender,age,cards);Person p2 = (Person) p1.clone();System.out.println(p1);System.out.println(p2);age = 20;System.out.println(p1);System.out.println(p2);name = "大明";System.out.println(p1);System.out.println(p2);cards[0] = null;System.out.println(p1);System.out.println(p2);Person p3 = (Person) deepClone(p1);System.out.println(p3);cards[0] = "建设银行";System.out.println(p3);}public static Object deepClone(Object from) throws IOException, ClassNotFoundException {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(from);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return ois.readObject();}
}
二:Apache BeanUtils常用的三个方法
- copyProperties(Object to, Object from):void
- describe(Object bean):Map
- populate(Object bean, Map):void
→ 附加 : BeanUtils中的copyProperties(Object to, Object from) 是浅拷贝,但是和一般使用clone()造成的浅克隆有部分差异;
copyProperties() 浅克隆会对数组进行完整克隆,但是引用类型不进行克隆;
clone() 浅克隆不会对数组进行克隆,同时也不会对引用类型进行克隆。
Test.java
import org.apache.commons.beanutils.BeanUtils;import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;public class Test {public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {Map<String,Object> map &#61; new HashMap<>();map.put("name","小明");map.put("GenDer","男");map.put("age",18);String[] hobby &#61; {"篮球", "足球", "羽毛球"};map.put("hobby",hobby);User user1 &#61; new User();BeanUtils.populate(user1,map);System.out.println(user1);Map<String,String> map1 &#61; BeanUtils.describe(user1);System.out.println(map1);Temp temp &#61; new Temp();temp.setTemp1(new Temp1("temp1-hello"));user1.setTemp(temp);User user2 &#61; new User();BeanUtils.copyProperties(user2,user1);System.out.println(user2);hobby[1] &#61; "???";temp.setA("AAA");temp.setTemp1(new Temp1("temp1_world"));System.out.println(user2);}
}
User.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;&#64;Data
&#64;RequiredArgsConstructor
&#64;AllArgsConstructor
public class User {private String name;private String gender;private Integer age;private String[] hobby;private Temp temp;
}
Temp.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;&#64;Data
&#64;RequiredArgsConstructor
&#64;AllArgsConstructor
public class Temp {private String a;private String b;private Temp1 temp1;
}
Temp1.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;&#64;Data
&#64;RequiredArgsConstructor
&#64;AllArgsConstructor
public class Temp1 {private String temp1Value;
}