必威体育Betway必威体育官网
当前位置:首页 > IT技术

BeanUtils、PropertiesUtils、BeanCopier copyProperties 出现ClassCastException

时间:2019-08-08 21:14:18来源:IT技术作者:seo实验室小编阅读:50次「手机版」
 

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.populate的用法

BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:完整方法:BeanUtils.populate( Object be

BeanUtils与PropertyUtils区别

相同的: 都是浅拷贝,都提供了copyProperties()方法,只要属性名相同就可以从源bean中拷贝值到目标bean中 不同点: BeanUtils.copyPrope

BeanUtils工具的使用

BeanUtils 属性拷贝 BeanUtils.copyProperties(a, b); 注意 在不同的包下面,拷贝顺序相反 org.springframework.beans.BeanUtil

Spring中提供的属性拷贝的方法BeanUtils.copyProperti

BeanUtils.copyProperties通过java反射将类中当前属性字段对应的内容复制到另外一个类中 //内部都是调用下面的私有方法 1. B

分享到:

栏目导航

推荐阅读

热门阅读