From 3894bc88c3ad92a4f9266f43cd2a55dcd188c045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=85=B6=E6=B7=87?= Date: Tue, 16 Nov 2021 12:11:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0clone=E7=9A=84=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=8E=A5=E5=8F=A3=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/clone/DefaultClone.java | 29 +++++++ .../hutool/core/clone/DefaultCloneTest.java | 86 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/clone/DefaultClone.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/clone/DefaultCloneTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/clone/DefaultClone.java b/hutool-core/src/main/java/cn/hutool/core/clone/DefaultClone.java new file mode 100644 index 000000000..acfb5f6c4 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/clone/DefaultClone.java @@ -0,0 +1,29 @@ +package cn.hutool.core.clone; + + +import java.lang.reflect.Method; + +public interface DefaultClone extends java.lang.Cloneable { + + /** + * 浅拷贝 + * 功能与 {@link CloneSupport#clone()} 类似, 是一种接口版的实现 + * 一个类,一般只能继承一个类,但是可以实现多个接口,所以该接口会有一定程度的灵活性 + * + * @param T + * @return obj + */ + @SuppressWarnings({"unchecked"}) + default T clone0() { + try { + final Class objectClass = Object.class; + final Method clone = objectClass.getDeclaredMethod("clone"); + clone.setAccessible(true); + return (T) clone.invoke(this); + } catch (Exception e) { + throw new CloneRuntimeException(e); + } + } +} + + diff --git a/hutool-core/src/test/java/cn/hutool/core/clone/DefaultCloneTest.java b/hutool-core/src/test/java/cn/hutool/core/clone/DefaultCloneTest.java new file mode 100644 index 000000000..c2c45285a --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/clone/DefaultCloneTest.java @@ -0,0 +1,86 @@ +package cn.hutool.core.clone; + + +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class DefaultCloneTest { + + @Test + public void clone0() { + Car oldCar = new Car(); + oldCar.setId(1); + oldCar.setWheelList(Stream.of(new Wheel("h")).collect(Collectors.toList())); + + Car newCar = oldCar.clone0(); + Assert.assertEquals(oldCar.getId(),newCar.getId()); + Assert.assertEquals(oldCar.getWheelList(),newCar.getWheelList()); + + newCar.setId(2); + Assert.assertNotEquals(oldCar.getId(),newCar.getId()); + newCar.getWheelList().add(new Wheel("s")); + + Assert.assertNotSame(oldCar, newCar); + + } + +} + +class Car implements DefaultClone { + private Integer id; + private List wheelList; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public List getWheelList() { + return wheelList; + } + + public void setWheelList(List wheelList) { + this.wheelList = wheelList; + } + + @Override + public String toString() { + return "Car{" + + "id=" + id + + ", wheelList=" + wheelList + + '}'; + } +} + + +class Wheel { + private String direction; + + public Wheel(String direction) { + this.direction = direction; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + @Override + public String toString() { + return "Wheel{" + + "direction='" + direction + '\'' + + '}'; + } +} + +