classcastexception
复制属性值,如果复制的实体对象中有list,在使用list的时候,如果list中的泛型是不一样的,就会出现类转化失败 java.lang.classcastexception: com.an.copy.Person cannot be cast to com.an.copy.User
public class Person {
private String name;
private integer age;
private String agender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAgender() {
return agender;
}
public void setAgender(String agender) {
this.agender = agender;
}
}
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class CompanyGrope {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
public class socialGroupe {
private List<Person> users;
public List<Person> getUsers() {
return users;
}
public void setUsers(List<Person> users) {
this.users = users;
}
}
public class Demo {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
List<Person> list = initData();
CompanyGrope companyGrope = new CompanyGrope();
SocialGroupe socialGroupe = new SocialGroupe();
socialGroupe.setUsers(list);
// BeanCopier beanCopier = BeanCopier.create(SocialGroupe.class, CompanyGrope.class, Boolean.FALSE);
// beanCopier.copy(socialGroupe,companyGrope,null);
copyProperties(companyGrope,socialGroupe);
// propertyutils.copyProperties(companyGrope,socialGroupe);
List<User> users = companyGrope.getUsers();
users.stream().foreach(s->{
System.out.println(s.getAge()+":"+s.getName()+":");
});
// System.out.println(JSON.toJSONString(companyGrope));
}
public static List<Person> initData(){
List<Person> list = new ArrayList<>();
{
Person person = new Person();
person.setAge(12);
person.setAgender("男");
person.setName("李四");
list.add(person);
}
{
Person person = new Person();
person.setAge(14);
person.setAgender("男1");
person.setName("李四2");
list.add(person);
}
{
Person person = new Person();
person.setAge(123);
person.setAgender("男3");
person.setName("李四4");
list.add(person);
}
return list;
}
}
CompanyGroupe 中有一个属性 users ,SocialGroupe 中也有一个属性 users ,beanutils,prpertiesUtil,BeanCopier都是只能copy基本数据类型,因为两个类中的属性名称是一样的,所以,将socialGroupe中的users复制给了companyGroupe的users,这个时候,打印companyGroupe的参数,你会发现,结果是:{“users”:[{“age”:12,“agender”:“男”,“name”:“李四”},{“age”:14,“agender”:“男1”,“name”:“李四2”},{“age”:123,“agender”:“男3”,“name”:“李四4”}]} 但是User中没有gender参数, 将companyGroupe中的users取出,遍历取值,就会出现类型转化失败
这个原因,就是上面说的,以上三种属性复制的工具类,只是对基本数据类型的复制,,list不是基本数据类型,所以,这个时候你可以看做是list 就是String, 复制的时候并没有将值转化成目标类之后的泛型 在调用companyGroupe中的list,遍历的时候才会进行类型转化,这个时候就会出现转化失败
所以,如果不是基本数据类型,在复制属性的时候,就需要循环复制
相关阅读
BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:完整方法:BeanUtils.populate( Object be
相同的: 都是浅拷贝,都提供了copyProperties()方法,只要属性名相同就可以从源bean中拷贝值到目标bean中 不同点: BeanUtils.copyPrope
BeanUtils 属性拷贝 BeanUtils.copyProperties(a, b); 注意 在不同的包下面,拷贝顺序相反 org.springframework.beans.BeanUtil
Spring中提供的属性拷贝的方法BeanUtils.copyProperti
BeanUtils.copyProperties通过java反射将类中当前属性字段对应的内容复制到另外一个类中 //内部都是调用下面的私有方法 1. B