# hutool - 深克隆
导入依赖:
<dependency> | |
<groupId>cn.hutool</groupId> | |
<artifactId>hutool-all</artifactId> | |
<version>5.7.22</version> | |
</dependency> |
如果想要使用 hutool 来实现对象的深克隆,可以使用如下:
ObjectUtil.cloneByStream(obj) |
PS:前提是这个对象必须实现 Serializable 接口才行,否则就会报错 空指针异常。
ObjectUtil 同样提供一些静态方法:clone (obj),clonefPossible (obj) 用于简化克隆调用,详细的说明请查看核心类的相关文档。
代码使用案例如下:
import cn.hutool.core.util.ObjectUtil; | |
import java.io.Serializable; | |
import java.util.Arrays; | |
public class Test implements Serializable /*Cloneable*/ | |
{ | |
private String name = "miaomaio"; | |
private int age = 18; | |
// private int arr[] = new int[]{1, 2, 3, 4, 5, 6}; | |
// @Override | |
// protected Test clone() | |
// { | |
// try | |
// { | |
// return (Test) super.clone(); | |
// } catch (CloneNotSupportedException e) | |
// { | |
// throw new RuntimeException(e); | |
// } | |
// } | |
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; | |
} | |
// public int[] getArr() | |
// { | |
// return arr; | |
// } | |
// | |
// public void setArr(int[] arr) | |
// { | |
// this.arr = arr; | |
// } | |
@Override | |
public String toString() | |
{ | |
return "Test{" + | |
"name='" + name + '\'' + | |
", age=" + age + | |
// ", arr=" + Arrays.toString(arr) + | |
'}'; | |
} | |
public static void main(String[] args) | |
{ | |
Test test1 = new Test(); | |
test1.setName("张三"); | |
test1.setAge(18); | |
// Test test2 = test1.clone(); | |
Test test2 = ObjectUtil.cloneByStream(test1); | |
test2.setName("李四"); | |
test2.setAge(20); | |
// test1.arr[0] = 9; | |
System.out.println("test1 : " + test1); | |
System.out.println("test2 : " + test2); | |
} | |
} |
测试顺序:1. 先进行简单的对象引用测试,2. 使用实现 Serializable 接口来进行浅拷贝,此时解开数组的注释就会发现浅拷贝不行事儿了,3. 使用 hutool 提供的 ObjectUtil.cloneByStream 来实现深拷贝,发现深拷贝可以解决数组问题