news 2026/3/16 5:19:08

Java反射利器:Apache Commons BeanUtils详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java反射利器:Apache Commons BeanUtils详解

Apache Commons BeanUtils是 Apache Commons 项目中的一个Java 工具库,主要用于简化 JavaBean 的操作,特别是通过反射(Reflection)动态读取、设置、复制和操作 JavaBean 的属性。


🧰 一、核心功能

1.动态读写 JavaBean 属性

无需调用具体的 getter/setter 方法,可通过属性名字符串操作。

// 假设有一个 Person 类,有 name、age 属性Personperson=newPerson();// 设置属性(等价于 person.setName("Alice"))BeanUtils.setProperty(person,"name","Alice");// 获取属性(等价于 person.getName())Stringname=(String)BeanUtils.getProperty(person,"name");

✅ 支持嵌套属性(如"address.city")、索引属性(如"hobbies[0]")、Map 属性(如"data(key)")。


2.对象属性拷贝(Bean to Bean)

将一个对象的属性值复制到另一个对象(属性名和类型需兼容)。

Personsource=newPerson("Bob",30);Persontarget=newPerson();// 复制同名属性BeanUtils.copyProperties(target,source);

⚠️ 注意:BeanUtils.copyProperties(dest, src)的参数顺序是dest 在前,src 在后(与 Spring 的BeanUtils.copyProperties(src, dest)相反!容易混淆)。


3.将 Map 转换为 JavaBean

常用于 Web 开发中将请求参数(Map<String, String[]>)填充到表单对象。

Map<String,String>params=newHashMap<>();params.put("name","Charlie");params.put("age","25");Personperson=newPerson();BeanUtils.populate(person,params);// 自动调用 setName / setAge

💡 这在早期 Struts1、Servlet 手动参数绑定中非常常见。


4.描述 Bean 结构

获取 Bean 的元信息(属性名、类型等)。

PropertyDescriptor[]descriptors=PropertyUtils.getPropertyDescriptors(Person.class);

🔒 二、安全性问题(⚠️ 重要!)

❗ CVE-2014-0114 / CVE-2019-10086 等高危漏洞

BeanUtils默认允许通过class 属性修改类加载器或执行任意代码(如果攻击者能控制属性名):

// 危险示例(不要在生产环境允许用户输入作为属性名!)BeanUtils.setProperty(obj,"class.loader...",evilValue);

✅ 安全建议:

  1. 避免使用用户输入作为属性名
  2. 升级到最新版(如commons-beanutils:1.9.4+);
  3. 考虑使用更安全的替代方案(如 Spring 的BeanWrapper、MapStruct、ModelMapper);
  4. 如必须使用,可自定义PropertyUtilsBean并禁用危险属性(如过滤class.*)。

📦 三、典型使用场景

场景说明
Web 框架参数绑定将 HTTP 请求参数自动填充到 ActionForm 或 DTO
对象转换快速复制相似对象(如 VO ↔ DTO)
配置加载从 Properties/Map 初始化配置对象
通用工具类编写与具体 Bean 解耦的通用逻辑

🆚 四、与 Spring BeanUtils 的区别

特性Apache Commons BeanUtilsSpring Framework BeanUtils
包路径org.apache.commons.beanutils.BeanUtilsorg.springframework.beans.BeanUtils
copyProperties参数顺序copyProperties(dest, src)copyProperties(src, dest)
类型转换内置基础类型转换(弱)使用 Spring 的ConversionService(强)
安全性历史漏洞较多更安全,默认不支持 class 操作
依赖需单独引入Spring 项目自带

建议:如果你在 Spring 项目中,优先使用Spring 的BeanUtilsBeanWrapper,更安全且集成更好。


📌 五、Maven 依赖

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version><!-- 推荐使用最新稳定版 --></dependency>

✅ 总结

Commons BeanUtils 的作用
通过反射提供一套便捷的 JavaBean 操作 API,支持动态属性访问、对象拷贝、Map 填充等,适用于需要解耦具体类结构的通用编程场景。

但要注意

  • 性能较低(大量反射);
  • 存在安全风险(尤其在处理不可信输入时);
  • 在现代项目中,优先考虑更安全、高效的替代方案

如果你有具体使用场景(比如“如何安全地用它做参数绑定”),我可以给出最佳实践代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 21:58:00

Python使用装饰器打印 被装饰函数的输入参数和返回值

import functools import logging from typing import Callablelogger logging.getLogger(__name__)def log_io(func: Callable) -> Callable:"""记录工具函数的输入参数和输出的装饰器。Args:function&#xff1a;要装饰的工具功能Returns:带有输入/输出日…

作者头像 李华
网站建设 2026/3/14 15:39:47

python基于vue的蛋糕商城论坛交流系统的设计与实现django flask pycharm

目录蛋糕商城论坛交流系统设计与实现技术架构与功能模块核心功能实现系统特色与创新点开发与测试开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;蛋糕商城论坛交流系统设计与实现 该系统采用…

作者头像 李华
网站建设 2026/3/14 15:39:45

高质量立体声环境录音素材哪里找?10个宝藏网站帮你搞定沉浸式音效创作!

现在无论是短视频创作、独立游戏开发还是播客制作&#xff0c;沉浸式音效已经成为提升作品质感的关键。而高质量立体声环境录音素材&#xff0c;正是构建这种沉浸感的基石——它能让听众仿佛置身于喧闹的咖啡馆、宁静的森林或者繁忙的都市街头。但很多创作者都在头疼&#xff1…

作者头像 李华
网站建设 2026/3/14 3:48:16

不锈钢丝杆升降机的优势是什么?

不锈钢丝杆升降机是针对潮湿、腐蚀、卫生要求高的特殊工况设计的机型&#xff0c;核心优势源于不锈钢材质的耐蚀性、卫生性&#xff0c;同时保留了普通丝杆升降机 “大扭矩、高精度、安装灵活” 的基础特性&#xff0c;具体优势可分为以下五大维度&#xff1a;一、超强耐腐蚀防…

作者头像 李华
网站建设 2026/3/13 16:52:08

python基于vue的二手车在线售卖系统的设计与实现django flask pycharm

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Python技术栈&#xff0c;结合Vue.js前端框架&#xff0c;设计并实现了一个功能完善的二手车在线售卖平台。后端采用…

作者头像 李华
网站建设 2026/3/13 14:29:49

转行网络安全工程师:月薪过万需要掌握哪些技能?

转行网络安全工程师&#xff1a;月薪过万需要掌握哪些技能&#xff1f; 一、引言 网络安全工程师薪资可观&#xff0c;不少人想转行进入该领域。要实现月薪过万&#xff0c;需具备扎实的技术能力&#xff0c;本文梳理核心技能要求&#xff0c;帮你明确学习方向。 二、核心硬技…

作者头像 李华