Java BeanUtils 類詳解:作用、語法與示例

一、BeanUtils 的核心作用

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

  1. 屬性拷貝:對象間同名屬性自動復制
  2. 動態訪問:通過字符串名稱操作屬性
  3. 類型轉換:自動處理不同類型間的轉換
  4. 嵌套訪問:支持?address.city?格式的鏈式訪問

📌?JavaBean 定義:符合規范的 POJO 類

  • 有無參構造函數
  • 屬性私有化
  • 提供 getter/setter 方法

二、Apache Commons BeanUtils

核心方法
方法作用示例
copyProperties(dest, orig)復制同名屬性BeanUtils.copyProperties(userDTO, user);
getProperty(bean, name)獲取屬性值String name = BeanUtils.getProperty(user, "name");
setProperty(bean, name, value)設置屬性值BeanUtils.setProperty(user, "age", "30");
describe(bean)對象轉 MapMap<String, String> map = BeanUtils.describe(user);
populate(bean, properties)Map 轉對象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. 創建源對象User source = new User("Alice", 25, new Address("New York"));// 2. 創建目標對象UserDTO target = new UserDTO();// 3. 屬性拷貝(同名屬性自動復制)BeanUtils.copyProperties(target, source);System.out.println(target); // 輸出: UserDTO{name='Alice', age=25, city='New York'}// 4. 動態獲取屬性String city = BeanUtils.getProperty(source, "address.city");System.out.println(city); // 輸出: New York// 5. 動態設置屬性BeanUtils.setProperty(target, "age", "30"); // 字符串自動轉int// 6. 對象轉MapMap<String, String> map = BeanUtils.describe(source);System.out.println(map); // {name=Alice, age=25, address=Address[city=New York]}// 7. Map轉對象Map<String, Object> data = new HashMap<>();data.put("name", "Bob");data.put("age", "35"); // 字符串自動轉換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;// 無參構造器、getter/setter 省略
}class UserDTO {private String name;private int age;private String city; // 對應 address.city// 無參構造器、getter/setter 省略
}class Address {private String city;// 構造器、getter/setter 省略
}

?

?

三、Spring BeanUtils

核心方法(更簡潔高效)
方法作用特點
copyProperties(source, target)屬性復制無類型轉換,性能更好
copyProperties(source, target, ignoreProperties)帶忽略屬性的復制跳過指定屬性

?

?使用示例

// 添加依賴
// <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. 基礎屬性復制BeanUtils.copyProperties(source, target);System.out.println(target.getCity()); // 輸出: null (不自動處理嵌套)// 2. 帶忽略屬性的復制BeanUtils.copyProperties(source, target, "age"); // 忽略age屬性System.out.println(target.getAge()); // 輸出: 0 (默認值)// 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}
}

?

四、最佳實踐與注意事項

1. 選擇指南
場景推薦工具
需要類型轉換Apache BeanUtils
高性能場景Spring BeanUtils
嵌套屬性訪問Apache BeanUtils
簡單屬性復制Spring BeanUtils
2. 性能對比
3. 常見問題解決

問題1:嵌套屬性復制失敗

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

問題2:類型轉換錯誤

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

問題3:忽略特定屬性

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

五、實際應用場景

場景1:DTO/VO 轉換
// Controller層
public UserDTO getUser(Long id) {User user = userService.findById(id);UserDTO dto = new UserDTO();BeanUtils.copyProperties(user, dto);return dto;
}
場景2:表單對象綁定
// 接收表單提交
public String createUser(@ModelAttribute UserForm form) {User user = new User();BeanUtils.copyProperties(form, user);userService.save(user);return "redirect:/users";
}
場景3:動態配置注入
// 從配置文件中讀取設置
@Value("${app.settings}")
private Map<String, String> settings;public void applySettings() {AppConfig config = new AppConfig();BeanUtils.populate(config, settings);
}
場景4:對象合并
public User mergeUserChanges(User original, User changes) {User merged = new User();BeanUtils.copyProperties(original, merged); // 復制原始數據BeanUtils.copyProperties(changes, merged);  // 覆蓋變更數據return merged;
}

總結:BeanUtils 作用

  1. 消除樣板代碼:減少 getter/setter 調用
  2. 提升開發效率:簡化對象操作
  3. 增強靈活性:支持動態屬性訪問
  4. 降低耦合度:解耦對象操作邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90722.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyCharm高效開發全攻略

安裝與基礎配置下載PyCharm專業版或社區版&#xff08;免費&#xff09;并完成安裝。首次啟動時選擇默認設置或自定義主題、字體大小等界面偏好。配置Python解釋器路徑&#xff08;推薦使用虛擬環境&#xff09;&#xff0c;確保項目依賴隔離。快捷鍵與導航熟悉核心快捷鍵能大幅…

Pycharm 給 python 程序打包EXE的配置和方法

前言: Python 語言的設計變得越來越簡單,它有很多可以使用的庫,所以尤其在人工智能時代,Python語言被廣泛應用。但是Python語言和windows系統的兼容性稍微偏弱,如何生成windows可以執行的exe文件。是要一個很復雜的配置過程,本文就會做一個介紹。 本文,通過一個Python…

【Linux | 網絡】傳輸層(UDP和TCP)

目錄一、再談端口號1.1 端口號1.2 端口號的范圍劃分1.3 常見知名端口號1.4 netstat 命令1.5 進程與端口號的關系1.6 pidof 命令二、UDP協議2.1 UDP協議段格式2.2 如何理解UDP報頭和UDP報文2.2.1 UDP報頭2.2.2 UDP報文和UDP報文的管理2.2.3 UDP封裝過程2.3 UDP的特點2.4 UDP的緩…

mybatisX的自定義模板生成

在idea中使用mybtais的自定義模板生成&#xff0c;可以幫我們省去很多重復的代碼。 打開一個項目&#xff0c;我們要修改的主要就兩個文件&#xff0c;一個是生成的mapper接口&#xff0c;另一個是xml文件&#xff1a; 相應的mapper接口模板為&#xff1a; package ${mapper…

miniz:一個輕量級、高性能的開源壓縮庫

目錄 1.簡介 2.核心特性 3.基本使用示例 4.與 ZLIB 的對比 5.使用場景 6.注意事項 1.簡介 miniz 是一個輕量級、高性能的開源壓縮庫&#xff0c;專注于提供 ZLIB/GZIP 兼容的壓縮和解壓縮功能。它的核心優勢在于體積小巧&#xff08;單文件實現&#xff09;、跨平臺支持和…

Jenkins接口自動化測試(構建)平臺搭建

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;自動化測試流程 在進行平臺搭建前&#xff0c;我們首先要問自己&#xff1a;我需要搭建的平臺的功能是什么&#xff0c;要實現什么目標&#xff1f; 在我的理解中&#xff0c;自動化構建平臺的執行流…

Day 22: 復習

機器學習數據處理與降維技術復習總結 前言 經過6天的學習&#xff0c;我們系統地學習了從基礎的Numpy數組操作到高級的降維算法&#xff0c;這些內容構成了機器學習數據預處理的重要知識體系。本文將對這一系列學習內容進行全面復習和總結&#xff0c;幫助大家建立完整的知識…

力扣 hot100 Day56

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 編碼規范全指南

在 Android 開發領域&#xff0c;代碼不僅是功能實現的載體&#xff0c;更是團隊協作與項目迭代的基礎。一套完善的編碼規范&#xff0c;能讓代碼從 “可運行” 升級為 “易維護、可擴展、低風險”。本文基于 Google、Square 等頂尖團隊的實踐經驗&#xff0c;結合國內 Android…

[RPA] Excel中的字典處理

案例1一個Excel文件總共有2個Sheet頁&#xff0c;分別為總表和對照表通過對照表sheet頁&#xff0c;設置價格對照字典對照表循環總表sheet頁&#xff0c;根據循環到的商品名稱&#xff0c;找到對應字典中的價格&#xff0c;并計算出總價總表將總價寫入到Excel表中C列&#xff0…

基于NSGAII優化算法的車間生產調度matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.參考文獻 6.完整程序 1.程序功能描述 車間生產調度是制造業的核心環節&#xff0c;其目標是在滿足設備約束、工序優先級等條件下&#xff0c;優化多個相互沖突的生產指標&#xff08;如…

Cmake、VS2019、C++、openGLopenCV環境安裝

在 CMake 和 Visual Studio 2019 環境下安裝和配置 OpenGL、OpenCV 以及 CUDA 可能會有些復雜&#xff0c;因為涉及的組件多且相互依賴。以下是一個詳細的指南&#xff0c;幫助您逐步完成安裝和配置。 1. 前提條件 在開始之前&#xff0c;請確保您已安裝以下軟件&#xff1a; …

視頻二維碼在產品設備說明書中的應用

在當今數字化的時代&#xff0c;傳統的產品設備說明書正面臨著一場變革。文字和圖片雖然能提供基本信息&#xff0c;但在復雜設備的安裝、操作和故障排除方面&#xff0c;往往顯得力不從心。而視頻二維碼的出現&#xff0c;為這一困境提供了完美的解決方案&#xff0c;它將冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全實戰手冊 一、核心概念與基礎 1、在pytest框架下運行測試用例&#xff0c;最基礎的一共有三點。導入pytest的包寫一個方法&#xff0c;或者類。后面運行的時候&#xff0c;相當于運行這個方法&#xff0c;或者類里的方法&#xff0c;無需…

基于OpenOCD 的 STM32CubeIDE 開發燒錄調試環境搭建 DAPLINK/STLINK

需要部署一個開發環境,實現h7的板子通過daplink功能給目標板燒寫程序(同事要將這個過程用fpga實現),需要通過openocd+gdb+daplink stm32; 總結:單條命令執行太麻煩,參考4寫成腳本文件: 獨立腳本使用Openocd ? 在**“在Stm32CubeIDE環境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee無線串口通信問題

使用 ZigBee 進行無線串口通信時&#xff0c;接收異常&#xff08;如丟包、亂碼、完全無法接收&#xff09;是常見問題&#xff0c;其原因涉及射頻通信特性、網絡機制、硬件配置、環境干擾等多個層面。以下從具體機制出發&#xff0c;詳細分析可能的原因&#xff1a;一、射頻層…

【AI周報】2025年7月26日

【AI周報】2025年7月第四周觀察&#xff1a;GitHub Spark重塑開發范式&#xff0c;中美AI政策對壘升級 省流版靜態頁面周報&#xff0c;為方便各位看官快速食用&#xff0c;我準備了摘要版周報&#xff0c;歡迎訪問&#xff1a;20250726周報 引言&#xff1a;本周焦點速覽 2…

HTML:從 “小白” 到 “標簽俠” 的修煉手冊

目錄 一、HTML&#xff1a;網頁的 “骨架” 不是骷髏架 二、文本標簽&#xff1a;文字的 “華麗變身” 術 1. 標題標簽&#xff1a;文字界的 “領導班子” 2. 段落標簽&#xff1a;文字的 “專屬保姆” 3. 文本格式化標簽&#xff1a;給文字 “穿花衣” 三、鏈接標簽&…

python3GUI--基于YOLO的火焰與煙霧檢測系統By:PyQt5(詳細圖文介紹)

文章目錄一&#xff0e;前言1.引言2.正文二&#xff0e;核心內容1.數據集2.模型訓練3.界面窗口1.登錄注冊界面2.核心功能界面3.檢測告警提示窗口三&#xff0e;.核心界面模塊介紹1.頂部信息區域2.數據輸入3.參數配置4.告警設置5.操作臺6.關于7.指標變化8.異常速覽9.日志輸出10.…

基于Transform、ARIMA、LSTM、Prophet的藥品銷量預測分析

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、數據準備與預處理三、模型選擇與方法設計1. ARIMA 模型&#xff1a;傳統統計方法的基線構建2. LSTM 模型&#xff1a;引入記憶機制的深度學習方法3. Transformer 模型&#…