一、示例:把人类复制到动物类
1、人类,关键点在于 腿 这个列表
- @Data
- public class Human {
- /**
- * 姓名
- */
- private String name;
-
- /**
- * 人的腿
- */
- private List
legs; - }
2、腿类,有两个属性,长度和数量
- @Data
- public class Leg {
- /**
- * 长度
- */
- private Integer length;
-
- /**
- * 数量
- */
- private Integer num;
- }
3、动物类,有个爪子的列表,属性名叫legs,为了与人类保持一致,这样才能拷贝
- @Data
- public class Animal {
- /**
- * 姓名
- */
- private String name;
-
- /**
- * 动物的腿(爪子)
- */
- private List
legs; -
- }
4、爪子类,注意与腿类的区别,它没有 数量的属性
- @Data
- public class Claw {
- /**
- * 长度
- */
- private Integer length;
- }
5、测试类:把人这个对象复制到动物对象
- public class Test {
- public static void main(String[] args) {
- //从人复制到动物
- Human human = new Human();
- human.setName("张三");
- List
legs = new ArrayList<>(); - Leg leg = new Leg();
- leg.setLength(1);
- leg.setNum(2);
- legs.add(leg);
- human.setLegs(legs);
- Animal animal = new Animal();
- BeanUtils.copyProperties(human, animal);
- System.out.println(JSON.toJSONString(animal));
- }
- }
6、测试结果:
{"legs":[{"length":1,"num":2}],"name":"张三"}
7、大家看出来什么了没有?
居然JSON String里面输出了num的属性,而在Claw类里面根本就没有该属性,这是为什么?
8、我们稍微修改一下测试类,在代码的最后增加一行代码:
- public class Test {
- public static void main(String[] args) {
- //从人复制到动物
- Human human = new Human();
- human.setName("张三");
- List
legs = new ArrayList<>(); - Leg leg = new Leg();
- leg.setLength(1);
- leg.setNum(2);
- legs.add(leg);
- human.setLegs(legs);
- Animal animal = new Animal();
- BeanUtils.copyProperties(human, animal);
- System.out.println(JSON.toJSONString(animal));
- Claw claw = animal.getLegs().get(0);
- }
- }
9、测试结果:
- {"legs":[{"length":1,"num":2}],"name":"张三"}
- Exception in thread "main" java.lang.ClassCastException: com.dd.Leg cannot be cast to com.dd.Claw
- at com.dd.Test.main(Test.java:26)
10、原因分析:
在BeanUtils.copyProperties的时候,执行的是浅复制,在对list进行复制的时候,因为泛型擦除,直接把List
所以我们在使用BeanUtils.copyProperties需要注意对于集合类的处理。