Java基礎知識18--hutool中BeanUtil工具類的常用方法;Java Bean間屬性值的復制(BeanUtils使用)


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使用 --推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM