BeanUtils.copyProperties 选择性赋值字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BeanUtils.copyProperties 选择性赋值字段相关的知识,希望对你有一定的参考价值。
参考技术A先创建一个实体类
在赋制数据
控制台输出如下数据,说明数据赋制成功。
在工作中不要全部赋制数据,需要有选择性赋制字段。 比如有三个字段 user1 , user2 , user3。
要将user1 的 name 值和user2 的 age 值赋值给user3。
BeanUtils.copyProperties 提供了忽略字段接口 ,源码如下:
以下是排除规则,如果字段为空,字段就不赋值。
实现上面的 user1,user2 的字段全都复制给 user3。
控制台输出如下数据,说明赋值成功。
BeanUtils.copyProperties()方法和PropertyUtils.copyProperties()的区别
首先两者来源于同一个包:
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils;
千万不要导包错误,否者会报异常。
BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
以下是几点要求及说明:
1、 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。
2、 BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到"后付前"这个词来帮助自己记忆这个功能。即将obj2的值赋值给obj1。
3、 如果2中实例obj2为空对象,即值new了他的实例并没有赋值的话obj1对应的属性值也会被设置为空置。
4、BeanUtils与PropertyUtils对比(这里对比copyProperties方法)
PropertyUtils的copyProperties()方法几乎与BeanUtils.copyProperties()相同,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,PropertyUtils不支持这个功能,所以说BeanUtils速度会更快一些,使用更普遍一点,犯错的风险更低一点。
举个例子:创建两个对象,然后 给一个对象赋值 最后把已经赋值的对象 copy到另一个空对象里面
首先创建Person对象
public class Person { private String name; private String sex; private int age; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
然后 创建Student 对象
public class Student { private String name; private String sex; private Integer age; private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", sex=‘" + sex + ‘\‘‘ + ", age=" + age + ", birthday=" + birthday + ‘}‘; } }
然后创建测试类:
public class Test { public static void main(String[] args) throws Exception{ Student student= new Student(); Person person = new Person(); person.setAge(23); person.setName("zhangsan"); person.setSex("nan"); person.setBirthday(new Date()); //PropertyUtils.copyProperties(student, person); BeanUtils.copyProperties(student, person); System.out.println(student.toString()); } }
执行以上方法会打印出:
Student{name=‘zhangsan‘, sex=‘nan‘, age=23, birthday=Thu Nov 24 10:32:10 CST 20
在执行 BeanUtils.copyProperties(student, person)时 如果把student对象的age 类型换成 String 也是可以打印出正常的结果。但是PropertyUtils.copyProperties(student, person)就会抛出异常。
以上是关于BeanUtils.copyProperties 选择性赋值字段的主要内容,如果未能解决你的问题,请参考以下文章
关于BeanUtils.copyProperties()用法和区别
使用 BeanUtils.copyProperties 复制特定字段?