首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Apache Commons BeanUtils 完全指南:屬性操作、對象複製、動態 Bean 與類型轉換

     編輯:Java 相關知識

簡介

Commons BeanUtils 提供了對 JavaBean 屬性的高層封裝,支援屬性獲取/設置、對象淺拷貝、Map 填充 Bean、動態 Bean(無需預定義類)等功能。官網:https://commons.apache.org/beanutils/。

準備工作:示例 Bean

package demo.bean;

import java.util.*;

public class Company {
    private String name;
    private Map<String, String> address = new HashMap<>();
    private String[] otherInfo;
    private List<String> product = new ArrayList<>();
    private List<String> employee = new ArrayList<>();
    private Map<String, String> telephone = new HashMap<>();

    // Getter/Setter 略...
}

核心功能演示

A. 單屬性獲取與設置

Company c = new Company();
c.setName("Lucy");
System.out.println(BeanUtils.getProperty(c, "name")); // Lucy

Map<String, String> tel = new HashMap<>();
tel.put("1", "234-222-1222211");
BeanUtils.setProperty(c, "telephone", tel);
System.out.println(c.getTelephone().get("1")); // 234-222-1222211

B. 對象淺拷貝

Company src = new Company();
src.setName("Lucy");

Company dest = new Company();
BeanUtils.copyProperties(dest, src); // 僅複製可讀寫屬性,同名同類型
System.out.println(BeanUtils.getProperty(dest, "name")); // Lucy

⚠️ 注意:copyProperties 執行淺拷貝,集合、Map、自定義對象屬性會共享引用。修改副本的集合內容會影響原對象。深拷貝需自行實現或使用序列化/第三方庫。

C. Map 自動填充 Bean

Map<String, String> map = new HashMap<>();
map.put("name", "Lucy");

Company c = new Company();
BeanUtils.populate(c, map); // 鍵名匹配屬性名,自動類型轉換
System.out.println(c.getName()); // Lucy

D. 動態 Bean:LazyDynaMap

無需定義類,運行時動態添加屬性,支援巢狀、索引屬性:

LazyDynaMap dyn = new LazyDynaMap();
dyn.set("foo", "bar");
dyn.set("customer", "title", "Mr");      // 巢狀屬性 customer.title
dyn.set("address", 0, "address1");       // 索引屬性 address[0]
System.out.println(dyn.get("address", 0)); // address1

Map<, > backingMap = dyn.getMap(); // 獲取底層 Map
System.out.println(backingMap);

關鍵屬性控制:

  • setReturnNull(true):獲取不存在屬性返回 null(默認 false 會自動創建)。
  • setRestricted(true):鎖定結構,禁止增刪改屬性(默認 false)。適合將動態 Bean 傳遞到表現層前鎖定結構,防止誤修改。

E. BeanUtils vs PropertyUtils

特性BeanUtilsPropertyUtils
類型轉換✅ 自動轉換(字符串→基本類型等)❌ 不轉換,類型必須精確匹配
性能較慢(轉換開銷)快(無轉換邏輯)
適用場景Web 表單綁定、配置映射等需類型轉換處高性能內部屬性複製、類型已知場景

若需自定義轉換邏輯,實現 org.apache.commons.beanutils.Converter 接口並註冊:ConvertUtils.register(converter, targetClass)。

總結

BeanUtils 是 JavaBean 元編程的利器,特別適合框架開發、表單綁定、配置映射等場景。善用 LazyDynaMap 可實現極靈活的動態數據結構,但需注意淺拷貝陷阱與類型轉換性能權衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved