平常開發(fā)的時候,經(jīng)常會使用BeanUtils.copyProperties()進行對象的拷貝,今天在項目中使用的時候出現(xiàn)了java.lang.classcastexception,發(fā)現(xiàn)是因為對象中的泛型導(dǎo)致的,只能進行基本類型的拷貝。
代碼示例
@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() 調(diào)用的時候,會報錯:
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封裝進行復(fù)制,這樣一般適合參數(shù)較少的時候。另外一種就是使用fastjson進行轉(zhuǎn)換。
//使用fastjson進行轉(zhuǎn)換
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的錯誤了。