平常开发的时候,经常会使用BeanUtils.copyProperties()进行对象的拷贝,今天在项目中使用的时候出现了java.lang.classcastexception
,发现是因为对象中的泛型导致的,只能进行基本类型的拷贝。
代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 @Data public class A { private String name; } @Data public class B { private String name; } @Data public class BeanA { List<A> a; } @Data public class BeanB { List<B> a; } public static void main (String[] args) { BeanA beanA = new BeanA (); List<A> aList = new ArrayList <>(); A a = new A (); a.setName("测试名称" ); aList.add(a); beanA.setA(aList); BeanB beanB = new BeanB (); BeanUtils.copyProperties(beanA, beanB); log.info(beanB.getA().get(0 ).getName()); }
当进行beanB.getA().get(0).getName()
调用的时候,会报错:
1 2 Exception in thread "main" java.lang.ClassCastException: com.example.demo.A cannot be cast to com.example.demo.B at com.example.demo.Test.main(Test.java:28 )
解决方法 解决上面的方法有两种,一种是将对象取出后,然后重新set封装进行复制,这样一般适合参数较少的时候。另外一种就是使用fastjson进行转换。
1 2 3 4 5 6 7 8 9 10 11 12 //使用fastjson进行转换 public static void main(String[] args) { BeanA beanA = new BeanA(); List<A> aList = new ArrayList<>(); A a = new A(); a.setName("测试名称"); aList.add(a); beanA.setA(aList); String jsonStr = JSON.toJSONString(beanA); BeanB beanB = JSON.parseObject(jsonStr,BeanB.class); log.info(beanB.getA().get(0).getName()); }
通过上面的方法就能避免java.lang.classcastexception的错误了。