BeanUtils.copyProperties 在欄位賦值上有強大的功能,如果有兩個的類,如果需要將相同的欄位賦值,就可以直接賦制。而不需要每個欄位都需要一個一個賦制。
BeanUtils.copyProperties 用法全賦制
先建立一個實體類
public class User {
private String name;
private Integer age;
// 省略get/set方法
}
在賦制資料
User use = new User();
use.setName("jeremy");
use.setAge(23);
User newUser = new User();
BeanUtils.copyProperties(use,newUser);
System.out.println("賦制後的資料,姓名:"+ newUser.getName() + " 年齡:" + newUser.getAge() );
控制檯輸出如下資料,說明資料賦製成功。
賦制後的資料,姓名:jeremy 年齡:23
選擇性賦制欄位
在工作中不要全部賦制資料,需要有選擇性賦制欄位。
比如有三個欄位 user1 , user2 , user3。
- user1 的 name 有值
- user2 的 age 有值
- user3 都沒值
要將user1 的 name 值和user2 的 age 值賦值給user3。
BeanUtils.copyProperties 提供了忽略欄位介面,原始碼如下:
public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {
copyProperties(source, target, (Class)null, ignoreProperties);
}
其中 ignoreProperties,將欄位排除在外。
以下是排除規則,如果欄位為空,欄位就不賦值。
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<String>();
for(PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
實現上面的 user1,user2 的欄位全都複製給 user3。
public static void main(String[] args) {
User user1 = new User();
user1.setName("jeremy");
User user2 = new User();
user2.setAge(23);
User user3 = new User();
BeanUtils.copyProperties(user1,user3);
System.out.println("user1 賦值給 user3 資料,姓名:" + user3.getName() + " 年齡:" + user3.getAge());
BeanUtils.copyProperties(user2,user3,getNullPropertyNames(user2));
System.out.println("user2 賦值給 user3 資料,姓名:" + user3.getName() + " 年齡:" + user3.getAge());
}
控制檯輸出如下資料,說明賦值成功。
user1 賦值給 user3 資料,姓名:jeremy 年齡:null
user2 賦值給 user3 資料,姓名:jeremy 年齡:23
如果覺得文章對你有幫助的話,請點個推薦吧!