BeanUtils & PropertyUtils & MethodUtils类使用方法
一、简介:
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
二、用法:
BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:
Java代码
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
throws java.lang.IllegalAccessException,
java.lang.reflect.InvocationTargetException
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
throws java.lang.IllegalAccessException,
java.lang.reflect.InvocationTargetException
如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:
Java代码
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:
Java代码
teacher.setModifyDate(new Date());
teacher.setModifyDate(new Date());
怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:
* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* float and java.lang.Float
* int and java.lang.Integer
* long and java.lang.Long
* short and java.lang.Short
* java.lang.String
* java.sql.Date
* java.sql.Time
* java.sql.Timestamp
这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。
三、优缺点:
Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:
Java代码
BeanUtils.copyProperties(aValue, aLocal);
BeanUtils.copyProperties(aValue, aLocal);
上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用了!
BeanUtils.copyProperties 与 PropertyUtils.copyProperties 都是拷贝对象属性的方法,BeanUtils 支持类型转换,而 PropertyUtils 不支持。但是 BeanUtils 不允许对象的属性值为 null,PropertyUtils 可以拷贝属性值 null 的对象。
如果对象属性值为 null,BeanUtils.copyProperties 方法会报 commons.beanutils.ConversionException: No value specified 错误。
现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!
MethodUtils类使用方法:
Java代码
package rong.propertyUtils;
import java.util.Map;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class TestPropertyUtils {
public static void main(String[] args) throws Exception{
Entity entity = new Entity();
//通过PropertyUtils的getProperty方法获取指定属性的值
Integer id = (Integer)PropertyUtils.getProperty(entity, "id");
String name = (String)PropertyUtils.getProperty(entity, "name");
System.out.println("id = " + id + " name = " + name);
//调用PropertyUtils的setProperty方法设置entity的指定属性
PropertyUtils.setProperty(entity, "name", "心梦帆影");
System.out.println("name = " + entity.getName());
//通过PropertyUtils的describe方法把entity的所有属性与属性值封装进Map中
Map map = PropertyUtils.describe(entity);
System.out.println("id = " + map.get("id") + " name = " + map.get("name"));
//通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(无参的情况)
System.out.println( MethodUtils.invokeMethod(entity, "haha", null) );
//通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(1参的情况)
MethodUtils.invokeMethod(entity, "sayHelle", "心梦帆影");
//通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(多参的情况)
Object[] params = new Object[]{new Integer(10),new Integer(12)};
String msg = (String)MethodUtils.invokeMethod(entity, "countAges", params);
System.out.println(msg);
}
}
分享到:
相关推荐
springboot167基于springboot的医院后台管理系统的设计与实现,含有完整的源码和报告文档
XGigE IP GigE Vision Streaming Protocol VHDL源码 有基于AC701 FPGA板卡的完整的参考工程
fluent重叠网格动网格,振荡翼型加摆动后缘小翼算例文件,udf文件,视频教程 流体力学,航空航天,船舶海洋,土木工程,能源动力专业必备
springboot174基于springboot的疾病防控综合系统的设计与实现,含有完整的源码和报告文档
SIGIR'22-减少虚假新闻检测中的实体偏差-论文复制_ ENDEF_glj
Vue3 是 Vue.js 框架的最新版本,它带来了许多重要的更新和改进,旨在提升开发效率、性能和可维护性。在这个名为“vue3-demo2”的项目中,我们可以探索 Vue3 的核心特性以及如何在实际应用中使用它们。
计算 Freeman 链代码以及边界的第一个差值和形状编号MATLAB代码.rar
dsp28335电机控制板zi料(软件代码) 1.永磁同步电机有传感器三闭环foc控制代码 2.永磁同步电机无传感器双闭环foc控制代码 3.无刷直流电机有传感器方波控制代码 4.异步电机V F变频调速控制代码 控制板和驱动版硬件电子资料+软件程序CCS6.0环境下运行
以下是校园二手书交易系统的功能描述,旨在促进学生之间的二手书交易,提高资源利用率和降低学习成本。 校园二手书交易系统功能描述 1. 用户角色 学生/买家 学生/卖家 管理员 2. 功能描述 学生/买家功能 用户注册与登录 支持使用邮箱、手机号或社交媒体账号注册和登录。 提供个人资料管理功能,包括用户名、联系方式等。 浏览与搜索 浏览二手书列表,可以按类别(教材、文学、参考书等)、价格区间、书名等进行筛选。 提供关键词搜索功能,快速找到需要的书籍。 书籍详情查看 查看书籍的详细信息,包括书名、作者、出版社、ISBN、成色、价格及卖家信息。 显示书籍的图片,以便更好地了解书籍状态。 在线购买 向卖家发送购买请求,支持订单确认和支付流程。 提供多种支付方式,如支付宝、微信支付等,方便快捷。 评价与反馈 对完成交易的卖家进行评价,提供反馈以帮助其他用户选择。 举报不良行为或虚假信息,维护交易环境的安全性。 收藏与关注 收藏感兴趣的书籍,便于后续查找。 关注卖家,接收其新上架书籍的通知。 学生/卖家功能 书籍发布 提供简单易用的书籍发布界面,填写书籍信息(如书名、作者、价格、成色
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
微信小程序-大树洞2.0 - 基于 WePY_szushudong
安徽打算几点刚把手机官方还是
网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面,个人大四毕业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测
comsol亚波长超声聚焦 仿真 生物超声、高强度聚焦能器 超声能器 超声传感器 MEMS PMUT PVDF压电能量收集器 1-3复合压电陶瓷 1-2复合压电陶瓷设计 超声匹配层研究 等等
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
springboot186人格障碍诊断系统,含有完整的源码和报告文档
WooCommerce微信小程序_从oocommerce到微信微信
python 一个基于基于python的人脸识别签到系统.zip 一个基于基于python的人脸识别签到系统.zip
springboot184基于springboot的校园网上店铺的设计与实现,含有完整的源码和报告文档
基于特征的视网膜图像配准Matlab代码.rar