news 2026/4/21 18:34:28

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/4/17 22:53:38

从0到1搭建无代码测试平台:非技术背景测试员的逆袭之路

在当今快速迭代的软件开发世界中&#xff0c;测试环节已成为产品质量的生命线。然而&#xff0c;对于许多非技术背景的测试员来说&#xff0c;传统的自动化测试工具如Selenium或Appium需要编程技能&#xff0c;这常常成为职业发展的瓶颈。想象一下&#xff1a;你是一名测试新手…

作者头像 李华
网站建设 2026/4/21 7:47:27

2025中国DevOps平台选型全景洞察:技术适配与效能跃升之道

2025中国DevOps平台选型全景洞察&#xff1a;技术适配与效能跃升之道 数字化转型已进入深水区&#xff0c;企业DevOps工具链选型标准正经历从基础功能完备性到本土化适配深度与安全可控能力的根本性转变。在技术架构与安全合规、生态融合与行业适配两个关键维度上&#xff0c;主…

作者头像 李华
网站建设 2026/4/20 7:21:50

大模型 如何扩展AI问答

文章目录问题拓展的定义与应用场景核心机制&#xff1a;大模型实现问题拓展的方法多样性保证技术示例分析挑战与改进方向总结问题拓展的定义与应用场景 问题拓展指在对话系统中基于用户问题与助手回复自动生成或推荐潜在后续问题&#xff0c;用于增强对话连贯性、主动满足用户…

作者头像 李华
网站建设 2026/4/21 15:12:27

python基于vue的大学生问卷调查系统的设计与实现django flask pycharm

目录基于Python与Vue的大学生问卷调查系统设计与实现开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Python与Vue的大学生问卷调查系统设计与实现 该系统采用前后端分离架构&#xff0c…

作者头像 李华
网站建设 2026/4/20 13:24:15

包装设计纹理素材别瞎找!10个网站+3个避坑要点,让包装质感翻倍!

对于包装设计师来说&#xff0c;纹理素材就像是包装的“第二层皮肤”&#xff0c;能瞬间提升产品的质感和辨识度——比如磨砂质感的化妆品包装显得高级&#xff0c;木纹包装让食品更有自然气息&#xff0c;而金属纹理则能凸显科技感。但很多设计师在找适合包装设计的纹理图片素…

作者头像 李华