最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?BeanUtils?類作用、語(yǔ)法與示例詳解

 更新時(shí)間:2025年08月14日 11:04:13   作者:我愛Jack  
BeanUtils是Apache?Commons和Spring?Framework提供的工具類,主要用于簡(jiǎn)化JavaBean的操作,接下來(lái)通過(guò)本文給大家介紹Java?BeanUtils?類作用、語(yǔ)法與示例詳解,感興趣的朋友跟隨小編一起看看吧

一、BeanUtils 的核心作用

BeanUtils 是 Apache Commons 和 Spring Framework 提供的工具類,主要用于簡(jiǎn)化 JavaBean 的操作。核心功能包括:

  1. 屬性拷貝:對(duì)象間同名屬性自動(dòng)復(fù)制
  2. 動(dòng)態(tài)訪問(wèn):通過(guò)字符串名稱操作屬性
  3. 類型轉(zhuǎn)換:自動(dòng)處理不同類型間的轉(zhuǎn)換
  4. 嵌套訪問(wèn):支持 address.city 格式的鏈?zhǔn)皆L問(wèn)

?? JavaBean 定義:符合規(guī)范的 POJO 類

  • 有無(wú)參構(gòu)造函數(shù)
  • 屬性私有化
  • 提供 getter/setter 方法

二、Apache Commons BeanUtils

核心方法

方法作用示例
copyProperties(dest, orig)復(fù)制同名屬性BeanUtils.copyProperties(userDTO, user);
getProperty(bean, name)獲取屬性值String name = BeanUtils.getProperty(user, "name");
setProperty(bean, name, value)設(shè)置屬性值BeanUtils.setProperty(user, "age", "30");
describe(bean)對(duì)象轉(zhuǎn) MapMap<String, String> map = BeanUtils.describe(user);
populate(bean, properties)Map 轉(zhuǎn)對(duì)象BeanUtils.populate(user, map);

 使用示例

// 添加依賴
// <dependency>
//     <groupId>commons-beanutils</groupId>
//     <artifactId>commons-beanutils</artifactId>
//     <version>1.9.4</version>
// </dependency>
import org.apache.commons.beanutils.BeanUtils;
public class CommonsExample {
    public static void main(String[] args) throws Exception {
        // 1. 創(chuàng)建源對(duì)象
        User source = new User("Alice", 25, new Address("New York"));
        // 2. 創(chuàng)建目標(biāo)對(duì)象
        UserDTO target = new UserDTO();
        // 3. 屬性拷貝(同名屬性自動(dòng)復(fù)制)
        BeanUtils.copyProperties(target, source);
        System.out.println(target); 
        // 輸出: UserDTO{name='Alice', age=25, city='New York'}
        // 4. 動(dòng)態(tài)獲取屬性
        String city = BeanUtils.getProperty(source, "address.city");
        System.out.println(city); // 輸出: New York
        // 5. 動(dòng)態(tài)設(shè)置屬性
        BeanUtils.setProperty(target, "age", "30"); // 字符串自動(dòng)轉(zhuǎn)int
        // 6. 對(duì)象轉(zhuǎn)Map
        Map<String, String> map = BeanUtils.describe(source);
        System.out.println(map); 
        // {name=Alice, age=25, address=Address[city=New York]}
        // 7. Map轉(zhuǎn)對(duì)象
        Map<String, Object> data = new HashMap<>();
        data.put("name", "Bob");
        data.put("age", "35"); // 字符串自動(dòng)轉(zhuǎn)換
        data.put("address.city", "London"); // 嵌套屬性
        User newUser = new User();
        BeanUtils.populate(newUser, data);
        System.out.println(newUser.getAddress().getCity()); // 輸出: London
    }
}
// JavaBean 類
class User {
    private String name;
    private int age;
    private Address address;
    // 無(wú)參構(gòu)造器、getter/setter 省略
}
class UserDTO {
    private String name;
    private int age;
    private String city; // 對(duì)應(yīng) address.city
    // 無(wú)參構(gòu)造器、getter/setter 省略
}
class Address {
    private String city;
    // 構(gòu)造器、getter/setter 省略
}

三、Spring BeanUtils

核心方法(更簡(jiǎn)潔高效)

方法作用特點(diǎn)
copyProperties(source, target)屬性復(fù)制無(wú)類型轉(zhuǎn)換,性能更好
copyProperties(source, target, ignoreProperties)帶忽略屬性的復(fù)制跳過(guò)指定屬性

 使用示例

// 添加依賴
// <dependency>
//     <groupId>org.springframework</groupId>
//     <artifactId>spring-beans</artifactId>
//     <version>5.3.20</version>
// </dependency>
import org.springframework.beans.BeanUtils;
public class SpringExample {
    public static void main(String[] args) {
        User source = new User("Alice", 25, new Address("New York"));
        UserDTO target = new UserDTO();
        // 1. 基礎(chǔ)屬性復(fù)制
        BeanUtils.copyProperties(source, target);
        System.out.println(target.getCity()); // 輸出: null (不自動(dòng)處理嵌套)
        // 2. 帶忽略屬性的復(fù)制
        BeanUtils.copyProperties(source, target, "age"); // 忽略age屬性
        System.out.println(target.getAge()); // 輸出: 0 (默認(rèn)值)
        // 3. 自定義屬性處理器
        class CustomConverter implements Converter {
            public Object convert(Class type, Object value) {
                if(value instanceof User) {
                    return ((User) value).getAddress().getCity();
                }
                return null;
            }
        }
        // 4. 處理嵌套屬性(需自定義)
        String city = (String) new CustomConverter().convert(String.class, source);
        target.setCity(city);
        System.out.println(target.getCity()); // 輸出: New York
    }
}

四、最佳實(shí)踐與注意事項(xiàng)

1. 選擇指南

場(chǎng)景推薦工具
需要類型轉(zhuǎn)換Apache BeanUtils
高性能場(chǎng)景Spring BeanUtils
嵌套屬性訪問(wèn)Apache BeanUtils
簡(jiǎn)單屬性復(fù)制Spring BeanUtils

2. 性能對(duì)比

3. 常見問(wèn)題解決

問(wèn)題1:嵌套屬性復(fù)制失敗

// Apache 解決方案
BeanUtils.setProperty(target, "address.city", "Paris");
// Spring 解決方案(需自定義)
class AddressMapper {
    public static void map(User source, UserDTO target) {
        target.setCity(source.getAddress().getCity());
    }
}

問(wèn)題2:類型轉(zhuǎn)換錯(cuò)誤

// 注冊(cè)自定義轉(zhuǎn)換器
ConvertUtils.register(new Converter() {
    public Object convert(Class type, Object value) {
        return LocalDate.parse(value.toString());
    }
}, LocalDate.class);
// 現(xiàn)在可以處理字符串轉(zhuǎn)LocalDate
BeanUtils.setProperty(target, "birthDate", "2023-01-01");

問(wèn)題3:忽略特定屬性

// Spring 方式
BeanUtils.copyProperties(source, target, "password", "sensitiveData");
// Apache 方式(需額外處理)
Map<String, String> map = BeanUtils.describe(source);
map.remove("password");
BeanUtils.populate(target, map);

五、實(shí)際應(yīng)用場(chǎng)景

場(chǎng)景1:DTO/VO 轉(zhuǎn)換

// Controller層
public UserDTO getUser(Long id) {
    User user = userService.findById(id);
    UserDTO dto = new UserDTO();
    BeanUtils.copyProperties(user, dto);
    return dto;
}

場(chǎng)景2:表單對(duì)象綁定

// 接收表單提交
public String createUser(@ModelAttribute UserForm form) {
    User user = new User();
    BeanUtils.copyProperties(form, user);
    userService.save(user);
    return "redirect:/users";
}

場(chǎng)景3:動(dòng)態(tài)配置注入

// 從配置文件中讀取設(shè)置
@Value("${app.settings}")
private Map<String, String> settings;
public void applySettings() {
    AppConfig config = new AppConfig();
    BeanUtils.populate(config, settings);
}

場(chǎng)景4:對(duì)象合并

public User mergeUserChanges(User original, User changes) {
    User merged = new User();
    BeanUtils.copyProperties(original, merged); // 復(fù)制原始數(shù)據(jù)
    BeanUtils.copyProperties(changes, merged);  // 覆蓋變更數(shù)據(jù)
    return merged;
}

總結(jié):BeanUtils 作用

  1. 消除樣板代碼:減少 getter/setter 調(diào)用
  2. 提升開發(fā)效率:簡(jiǎn)化對(duì)象操作
  3. 增強(qiáng)靈活性:支持動(dòng)態(tài)屬性訪問(wèn)
  4. 降低耦合度:解耦對(duì)象操作邏輯

相關(guān)文章

  • Java高效利用異常處理的技巧總結(jié)

    Java高效利用異常處理的技巧總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java如何高效利用異常處理,從而達(dá)到優(yōu)化代碼的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-09-09
  • Java虛擬機(jī)堆內(nèi)存溢出的原因和解決方法

    Java虛擬機(jī)堆內(nèi)存溢出的原因和解決方法

    在Java開發(fā)中,內(nèi)存溢出(OutOfMemoryError)是一個(gè)常見的問(wèn)題,尤其是在處理大量數(shù)據(jù)或長(zhǎng)時(shí)間運(yùn)行的應(yīng)用時(shí),本文將通過(guò)一個(gè)簡(jiǎn)單的示例,展示如何通過(guò)JVM參數(shù)和代碼分析來(lái)理解和解決內(nèi)存溢出問(wèn)題,需要的朋友可以參考下
    2024-10-10
  • Java通過(guò)MyBatis框架對(duì)MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法

    Java通過(guò)MyBatis框架對(duì)MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法

    MyBatis框架由Java的JDBC API進(jìn)一步封裝而來(lái),在操作數(shù)據(jù)庫(kù)方面效果拔群,接下來(lái)我們就一起來(lái)看看Java通過(guò)MyBatis框架對(duì)MySQL數(shù)據(jù)進(jìn)行增刪查改的基本方法:
    2016-06-06
  • SpringCloud?分布式鎖的多種實(shí)現(xiàn)

    SpringCloud?分布式鎖的多種實(shí)現(xiàn)

    本文主要介紹了SpringCloud?分布式鎖的多種實(shí)現(xiàn),主要有三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot使用jsoup爬取HTML的方法

    SpringBoot使用jsoup爬取HTML的方法

    jsoup 是一款 Java 的 HTML 解析器,它提供了一套非常便利的 API,可通過(guò) DOM、CSS 通過(guò)類似于 JQuery 的操作方法來(lái)取出和操作數(shù)據(jù),這篇文章主要介紹了SpringBoot使用jsoup爬取HTML,需要的朋友可以參考下
    2024-02-02
  • PowerJobAutoConfiguration自動(dòng)配置源碼流程解析

    PowerJobAutoConfiguration自動(dòng)配置源碼流程解析

    這篇文章主要為大家介紹了PowerJobAutoConfiguration自動(dòng)配置源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java基礎(chǔ)之文件和目錄操作

    Java基礎(chǔ)之文件和目錄操作

    這篇文章主要介紹了Java基礎(chǔ)之文件和目錄操作,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java后端SSM框架圖片上傳功能實(shí)現(xiàn)方法解析

    Java后端SSM框架圖片上傳功能實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Java后端SSM框架圖片上傳功能實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java中LinkedHashSet的實(shí)現(xiàn)原理詳解

    Java中LinkedHashSet的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java中LinkedHasSet的實(shí)現(xiàn)原理詳解,LinkedHashSet?是具有可預(yù)知迭代順序的?Set?接口的哈希表和鏈接列表實(shí)現(xiàn),此實(shí)現(xiàn)與HashSet?的不同之處在于,后者維護(hù)著一個(gè)運(yùn)行于所有條目的雙重鏈接列表,需要的朋友可以參考下
    2023-09-09
  • Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解

    Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解

    前幾天小編給大家介紹了Java線性結(jié)構(gòu)中的鏈表,除了鏈表這種結(jié)構(gòu)之外,實(shí)際上還有棧、隊(duì)列、串等結(jié)構(gòu),那么這些結(jié)構(gòu)又有哪些特點(diǎn)呢,本文就給大家詳細(xì)的介紹一下,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-07-07

最新評(píng)論

多伦县| 年辖:市辖区| 乐陵市| 呼图壁县| 土默特左旗| 称多县| 湖州市| 高密市| 平昌县| 托克逊县| 庆云县| 新丰县| 定远县| 阜南县| 武邑县| 仁布县| 日土县| 会同县| 新巴尔虎右旗| 乌海市| 准格尔旗| 蒲城县| 梁河县| 丰都县| 江华| 紫阳县| 托里县| 承德县| 岗巴县| 铁岭县| 汝南县| 遵化市| 恩施市| 梧州市| 晋江市| 琼结县| 深州市| 丽水市| 祁门县| 漳平市| 漳州市|