1. hutool中BeanUtil工具類的常用方法
構造兩個實體類:
Employee.java
package com.ttbank.flep.test; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.util.Date; /** * @Author lucky * @Date 2022/6/28 17:48 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors public class Employee { public static Integer a; private Integer id; private String employeeName; // 變量名為 employeeName private Integer gender; private Date birth; private Integer salary; // 設置為 Integer 類型 }
User.java
package com.ttbank.flep.test; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.util.Date; /** * @Author lucky * @Date 2022/6/28 17:47 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors public class User { public static int a = 2020; private Integer id; private String userName; // 變量名為 userName private Integer gender; // 0女,1男 private Date birth; private Double salary; // 設置為 Double 類型 }
pom依賴:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.1.19</version> </dependency>
1.1 beanToMap方法與mapToBean方法
Map<String, Object> beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue)
功能:將一個對象轉換成Map<String, Object>,屬性名為key,值為value,只支持實例變量。
參數解釋:bean待轉對象,isToUnderlineCase是否轉下划線,ignoreNullValue是否忽略空值。
返回值:返回轉換后的Map對象。
public static void main(String[] args) { User user = new User(1001,"張三",0,null,8000.0); Map<String, Object> map1 = BeanUtil.beanToMap(user, false, false); // 不轉下划線,不忽略空值 Map<String, Object> map2 = BeanUtil.beanToMap(user, true, true); // 轉下划線,忽略空值 System.out.println(map1); // {id=1001, userName=張三, gender=0, birth=null, salary=8000.0} System.out.println(map2); // {id=1001, user_name=張三, gender=0, salary=8000.0} User user1 = BeanUtil.mapToBean(map1, User.class, false); System.out.println(user1.toString()); //User(id=1001, userName=張三, gender=0, birth=null, salary=8000.0) }
1.2 copyProperties方法
最實用的方法,比如遠程獲取幾個屬性,然后返回給VO,用這個方法避免了一個個同名參數的復制
public static void copyProperties(Object source, Object target, CopyOptions copyOptions)
- 功能:復制屬性,類似克隆,但比clone()方法更強大。
- 參數解釋:source待克隆對象,target克隆后返回對象類型,ignoreProperties哪些屬性忽略不克隆。
- 返回值:復制屬性完成后,返回復制后的對象。
CopyOptions 配置項:
CopyOptions 參數提供一些 BeanUtils.copyProperties 注入屬性的選項。
(1) ignoreNullValue 是否忽略空值,當源對象的值為 null 時,true: 忽略而不注入此值,false: 注入 null
(2) ignoreProperties 忽略的屬性列表,設置一個屬性列表,不拷貝這些屬性值
(3) ignoreError 是否忽略字段注入錯誤
(4) 可以通過 CopyOptions.create () 方法創建一個默認的配置項,通過 setXXX 方法設置每個配置項。
public static void main(String[] args) { User user = new User(1001,"張三",1,DateUtil.parse("1997-12-08"), 8000.0); Employee employee = new Employee(); BeanUtil.copyProperties(user, employee, CopyOptions.create().setIgnoreNullValue(true)); // 將user對象,克隆成Employee類型返回,忽略屬性id System.out.println(employee);//Employee(id=1001, employeeName=null, gender=1, birth=1997-12-08 00:00:00, salary=8000) }
2.Java Bean間屬性值的復制(BeanUtils使用)
需求:兩個對象中有相同類型相同名稱的屬性,把一個對象中的屬性值復制到另一個對象。
注意:方法1和方法2實現的效果是一樣的;
方法1:
maven依賴:
<dependency> <groupId>org.springframework</groupId> <artifactId>org.springframework.beans</artifactId> <version>3.1.3.RELEASE</version> </dependency>
public static void copyProperties(Object source, Object target)
該方法只能對一個bean中普通屬性字段進行copy,如果這個bean中有其他的bean,即bean中bean,就需要將其值取出,單獨對這個子bean進行copy,然后set進父bean,這種copy如果在bean層次少的時候還無所謂,如果在bean的層次比較深的時候,就會發現很是繁瑣了
將a拷貝到b(只拷貝相同的屬性值)
BeanUtils.copyProperties(a, b);
- b中的存在的屬性,a中一定要有,但是a中可以有多余的屬性;
- a中與b中相同的屬性都會被替換,不管是否有值;
- a、 b中的屬性要名字相同,才能被賦值,不然的話需要手動賦值;
- Spring的BeanUtils的CopyProperties方法需要對應的屬性有getter和setter方法;
- 如果存在屬性完全相同的內部類,但是不是同一個內部類,即分別屬於各自的內部類,則spring會認為屬性不同,不會copy;
- spring和apache的copy屬性的方法源和目的參數的位置正好相反,所以導包和調用的時候都要注意一下。
方法2:
實體類:
Customer類
/** * @Author lucky * @Date 2022/1/4 10:28 */ @Slf4j @Builder @Data public class Customer { private String name; private int age; private String gender; private Map<String,String> params; private Map<String,String> heads; }
User類:
@Data @Builder @Slf4j @AllArgsConstructor @NoArgsConstructor public class User { private String name; private int age; private String gender; private Map<String,String> params; }
工具類:
/** * @Author lucky * @Date 2022/1/4 10:14 */ @Slf4j public class BeanCopyUtils { public static <T> void beanCopyProperties(T src, T dest){ Map<String,Object> properties=new HashMap<>(); Arrays.stream(src.getClass().getDeclaredFields()).forEach((field -> { try { field.setAccessible(true); properties.put(field.getName(), field.get(src)); } catch (IllegalAccessException e) { //log.error("",e ); } })); populateBean(dest,dest.getClass(),properties); populateBean(dest,dest.getClass().getSuperclass(),properties); } private static <T> void populateBean(T bean,Class clazz,Map<String,Object> properties){ Arrays.stream(clazz.getDeclaredFields()).forEach((field -> { try { field.setAccessible(true); //如果非空,覆蓋原有值;如果為空,則不覆蓋原有值 if(properties.get(field.getName())!=null){ field.set(bean,properties.get(field.getName())); } } catch (IllegalAccessException e) { //log.error("",e); } })); } public static void main(String[] args) { Map<String,String> params=new HashMap<>(); params.put("userInfo","ttbank 2021"); Customer customer = Customer.builder().age(26).gender("man").params(params).build(); //01 使用自己創建的工具類 User user=new User(); user.setName("lucky"); beanCopyProperties(customer, user); System.out.println(user); params.put("userInfo","ttbank 2022"); System.out.println(user); System.out.println(customer); //02 使用工具類BeanUtils User user2=new User(); BeanUtils.copyProperties(customer,user2); System.out.println(user2); } }
控制台輸出:
User(name=lucky, age=26, gender=man, params={userInfo=ttbank 2021}) User(name=lucky, age=26, gender=man, params={userInfo=ttbank 2022}) Customer(name=null, age=26, gender=man, params={userInfo=ttbank 2022}, heads=null) User(name=null, age=26, gender=man, params={userInfo=ttbank 2022})
參考文獻:
https://blog.csdn.net/qq_37276508/article/details/102366097
https://blog.csdn.net/str_tang/article/details/108034911---hutool使用 --推薦