在Java中,對(duì)象克隆是指創(chuàng)建一個(gè)與原始對(duì)象具有相同屬性和值的新對(duì)象。
Java提供了兩種克隆方法:淺克隆和深克隆。淺克隆會(huì)復(fù)制對(duì)象的基本屬性,但不會(huì)復(fù)制對(duì)象中的其他引用類型,而深克隆則會(huì)復(fù)制對(duì)象以及其中所有的引用類型。在實(shí)際項(xiàng)目中,我們常需要用到對(duì)象克隆的功能。以下是一個(gè)簡(jiǎn)單的例子:
public class Person implements Cloneable { private String name; private int age; private Listhobbies; // 省略 get 和 set 方法 @Override public Person clone() { Person person = null; try { person = (Person) super.clone(); person.hobbies = new ArrayList<>(this.hobbies); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } }
通過實(shí)現(xiàn)Cloneable接口,并覆蓋Object類中的clone()方法,我們可以實(shí)現(xiàn)對(duì)象的淺克隆。在上面的例子中,我們沒有直接使用對(duì)象的clone()方法,而是通過new新建一個(gè)List,然后把原對(duì)象中的hobbies屬性復(fù)制到新的List中。這樣做可以保證我們?cè)谑褂迷瓕?duì)象和克隆對(duì)象時(shí)不會(huì)發(fā)生互相干擾。
除了通過對(duì)象的clone()方法來實(shí)現(xiàn)對(duì)象克隆外,Apache Commons BeanUtils也提供了快速、方便的克隆方式。我們可以使用BeanUtils類中的cloneBean()方法來完成對(duì)象的快速克隆。以下是一個(gè)使用BeanUtils進(jìn)行克隆的示例:
public class Person { private String name; private int age; private Listhobbies; // 省略 get 和 set 方法 } Person p1 = new Person(); p1.setName("張三"); p1.setAge(18); List hobbies = new ArrayList<>(); hobbies.add("唱歌"); hobbies.add("跳舞"); p1.setHobbies(hobbies); Person p2 = null; try { p2 = (Person) BeanUtils.cloneBean(p1); } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); } System.out.println(p1 == p2); // false System.out.println(p1.getHobbies() == p2.getHobbies()); // true
通過使用BeanUtils的cloneBean()方法,我們可以快速地創(chuàng)建一個(gè)與原對(duì)象相同屬性和值的新對(duì)象。需要注意的是,BeanUtils會(huì)默認(rèn)使用對(duì)象的反射機(jī)制,因此在使用時(shí)需要處理IllegalAccessException、InstantiationException、InvocationTargetException和NoSuchMethodException等異常。