1.属性的动态getter,setter
在这框架满天飞的年代,不能事事都保证执行getter,setter函数了,有时候属性是要需要根据名字动态取得的,就像这样:
BeanUtils.getProperty(myBean,"code");
而BeanUtils更强的功能是直接访问内嵌对象的属性,只要使用点号分隔。
BeanUtils.getProperty(orderBean, "address.city");
相比之下其他类库的BeanUtils通常都很简单,不能访问内嵌的对象,所以经常要用Commons BeanUtils替换它们。
BeanUtils还支持List和Map类型的属性。如下面的语法即可取得顾客列表中第一个顾客的名字
BeanUtils.getProperty(orderBean, "customers[1].name");
其中BeanUtils会使用ConvertUtils类把字符串转为Bean属性的真正类型,方便从HttpServletRequest等对象中提取bean,或者把bean输出到页面。
而PropertyUtils就会原色的保留Bean原来的类型。
2.beanCompartor 动态排序
还是通过反射,动态设定Bean按照哪个属性来排序,而不再需要在bean的Compare接口进行复杂的条件判断。
List peoples = ...; // Person对象的列表Collections.sort(peoples, new BeanComparator("age"));
如果要支持多个属性的复合排序,如"Order By lastName,firstName"
ArrayList sortFields = new ArrayList();sortFields.add(new BeanComparator("lastName"));
sortFields.add(new BeanComparator("firstName"));
ComparatorChain multiSort = new ComparatorChain(sortFields);
Collections.sort(rows,multiSort);
其中ComparatorChain属于jakata commons-collections包。
如果age属性不是普通类型,构造函数需要再传入一个comparator对象为age变量排序。
另外, BeanCompartor本身的ComparebleComparator, 遇到属性为null就会抛出异常, 也不能设定升序还是降序。
这个时候又要借助commons-collections包的ComparatorUtils.
Comparator mycmp = ComparableComparator.getInstance();
mycmp = ComparatorUtils.nullLowComparator(mycmp); //允许null
mycmp = ComparatorUtils.reversedComparator(mycmp); //逆序
Comparator cmp = new BeanComparator(sortColumn, mycmp);
3.Converter 把Request或ResultSet中的字符串绑定到对象的属性
经常要从request,resultSet等对象取出值来赋入bean中,下面的代码谁都写腻了,如果不用MVC框架的绑定功能的话。
String a = request.getParameter("a"); bean.setA(a); String b = ....
不妨写一个Binder:
MyBean bean = ...; HashMap map = new HashMap(); Enumeration names = request.getParameterNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); map.put(name, request.getParameterValues(name)); } BeanUtils.populate(bean, map);
其中BeanUtils的populate方法或者getProperty,setProperty方法其实都会调用convert进行转换。
但Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。而且它比较笨的一个地方是当遇到不认识的类型时,居然会抛出异常来。
对于Date类型,我参考它的sqldate类型实现了一个Converter,而且添加了一个设置日期格式的函数。
要把这个Converter注册,需要如下语句:
ConvertUtilsBean convertUtils = new ConvertUtilsBean();
DateConverter dateConverter = new DateConverter();
convertUtils.register(dateConverter,Date.class);
//因为要注册converter,所以不能再使用BeanUtils的静态方法了,必须创建BeanUtilsBean实例
BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtils,new PropertyUtilsBean());
beanUtils.setProperty(bean, name, value);
4 其他功能
4.1 PropertyUtils,当属性为Collection,Map时的动态读取:
Collection: 提供index
BeanUtils.getIndexedProperty(orderBean,"items",1);
或者
BeanUtils.getIndexedProperty(orderBean,"items[1]");
Map: 提供Key Value
BeanUtils.getMappedProperty(orderBean, "items","111");//key-value goods_no=111
或者
BeanUtils.getMappedProperty(orderBean, "items(111)")
4.2 PropertyUtils,获取属性的Class类型
public static Class getPropertyType(Object bean, String name)
4.3 ConstructorUtils,动态创建对象
public static Object invokeConstructor(Class klass, Object arg)
4.4 MethodUtils,动态调用方法
MethodUtils.invokeMethod(bean, methodName, parameter);
4.5 动态Bean 见用DynaBean减除不必要的VO和FormBean
http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html
apache提供的一个api,之前做过一些update都是手动来解决,后来发现apache提供了反射等一系列强大的功能,给我们使用!!!大家也瞧瞧吧,需要源码的留下邮箱!
昨天发现一个问题!
//使用BeanUtils.populate(user,map);
//如果user里有个address对象,直接给对象不需要拆开放
map.put("address",u.getAddress());
反射属性
// //insert beanData
// MerchantOrder mer = new MerchantOrder();
// String[] obj = new String[]{"id","zip"};
// for(int j = 0;j<list.size();j++){
// HSSFRow row1 = worksheet.createRow((short) j+9);
// MerchantOrder mer = list.get(j);
// for(int i = 0;i<19;i++){
// HSSFCell cell = row.createCell((short) i);
// cell.setCellValue(j+1);
// try {
// BeanUtils.getProperty(mer,obj[i]);
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// }
// }
// }
分享到:
相关推荐
"基于PID搜索优化算法的FMD分解优化研究与应用","基于PSA与PID搜索优化算法的FMD分解创新方法:一种2023年SCI顶刊实践的智能优化技术",【优化fmd分解】PSA–fmd分解,PID搜索优化算法(PID-based search algorithm, PSA,2023年12月发表在SCI人工智能一区顶刊《Expert Systems With Applications》,利用该算法优化fmd分解,做为一种创新点使用。 具体如下图 ,优化fmd分解; PSAfmd分解; PID搜索优化算法; 创新点,基于PSA算法的FMD分解优化研究
内容概要:本文档详细介绍了DBC文件的格式及其组成部分,用于描述CAN通讯网络。主要内容涵盖版本和新规范符号、位定时、节点、数值表、报文和信号的定义、环境变量、注释以及用户属性等方面。通过对各部分的解析,可以帮助开发者更好地理解和配置CAN网络的通讯参数。文档还包括具体的实例,帮助理解实际应用场景。 适合人群:主要适用于从事汽车电子控制系统开发的技术人员,尤其是负责车载网络通信的设计和实施的工程师。 使用场景及目标:帮助工程师解析和创建CAN网络的DBC文件,确保正确配置和优化CAN总线通信,提高系统的可靠性和效率。通过DBC文件进行网络节点定义、信号传输设置等任务,有助于加速产品的开发周期并减少错误配置的风险。 其他说明:虽然DBC文件主要用于描述CAN通讯,但它不能直接定义环境变量或进行系统仿真。此外,某些部分(如过滤器和支持旧标准的部分)已废弃但仍需保留在文件中以维持兼容性。
"2024视酷酷信IM即时通讯源码:全4端互通,安全稳定,支持二次开发及多端部署","2024视酷酷信IM即时通讯源码:全4端互通,安全可靠,可二次开发,适用于技术达人的专业级即时通讯系统",2024亲测可用视酷酷信即时通讯,IM即时通讯源码 全4端互通通讯带教程源码 完整版,可以搭建成功 1.适合有技术能力的 2.源码支持二次开发和修改,可以二开加商城等 3.源码没有任何后门,安全部署到自己的服务器上,无需担心数据丢失,隐私有保障 4.4端互通,使用国产最新tio通信技术,tigase都是老版的 软件部署环境: 1.客户端:安卓,苹果,pc端、web端 2.开发语言: Java、 OC、 C#、vue 3.运行软件:idea Java xcode android studio、Visual Studio 4.数据库:mongodb (可大量存储数据) 5.环境:linux系统centos7.6 6.系统优势:单台服务器可承载万人并发同时在线;需求大的话可做集群,性能非常强大 ,2024年; 视酷酷信即时通讯; IM源码; 全4端互通通讯; 源码二开; 安全部署; TIO通信技
雨天前车窗雨滴等障碍物图像分割系统:新手课程精选
"Aspen Plus模拟下的生物质化学链工艺:氢气与氨气的绿色生产模型","Aspen Plus模拟:生物质化学链工艺生产氢气和氨气的清洁化过程",Aspen Plus化工过程模拟化学链工艺从生物质中生产氢气和氨气 本模型复现了Journal of Cleaner Production中一篇文章的模型。 在本模型中,首先将生物质通过化学链工艺转化为氢气,之后使用哈伯法将氢气转化为氨气。 ,Aspen Plus; 化工过程模拟; 化学链工艺; 生物质; 氢气生产; 氨气生产; Journal of Cleaner Production; 哈伯法。,"Aspen Plus模拟化学链工艺产氢氨从生物质出发"
"光伏混合储能系统中的VSG技术:实现光储一次调频、功率平抑及直流母线电压控制的高效策略",光伏混合储能VSG系统:实现光储一次调频、功率平抑及直流母线电压控制的多功能应用,光伏混合储能VSG一一光储一次调频、功率平抑、 直流母线电压控制。 ,核心关键词:光伏混合储能; VSG; 光储一次调频; 功率平抑; 直流母线电压控制;,"光伏混合储能系统中的VSG技术与调频、功率平抑及电压控制"
chat-api.yaml.bak
前端分析-2023071100789
新建 Microsoft Excel 工作表.xlsx
c 使用 C#,开发一个气溶胶光学厚度反演算法的窗体应用程序 使用 C#,开发一个气溶胶光学厚度反演算法的窗体应用程序
本文全面介绍了Go语言的学习资源,包括官方文档、在线教程、书籍推荐、开源项目、工具框架、社区论坛、实战项目、进阶资源以及视频教程和博客文章等多个方面。通过官方文档、Go Tour、书籍如《The Go Programming Language》等优质资料可以帮助读者系统地学习Go语言。开源项目如Docker、Kubernetes展示了Go语言的实际应用;Go Modules等工具提供了便捷的支持;而实战项目能提高动手能力。博客文章则分享了前沿技术见解,视频教程适合视听学习者。
"基于StarCCM+的储能液冷系统热管理仿真教学视频:带热失控仿真计算,三个模型文件实战练习","基于StarCCM+的储能液冷系统热管理仿真教学视频:带热失控仿真计算与三个模型文件供练习的实践指南",储能热管理 基于starccm+ 储能液冷系统热管理仿真 带热失控仿真计算…… 教学视屏,三个模型文件供练习。 储能热管理 ,核心关键词:储能热管理;starccm+仿真;液冷系统热管理;热失控仿真计算;教学视屏;模型文件练习。,《基于Starccm+的储能液冷系统与热失控仿真教学视频》
【毕业设计】IoT安全漏洞检测平台(中国民航大学本科毕业设计)
显示湿度 51单片机代码 大学生嵌入式
【毕业设计】校园二手商品交易平台,ssm框架+layui_pgj
c 一个基于C#的STK二次开发 一个基于C#的STK二次开发
2024免费毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 技术栈:Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode。
"基于随机森林算法的RF多变量时间序列预测外部工具箱:Matlab代码与Windows 64位系统兼容版",基于随机森林算法的RF多变量时间序列预测工具箱:Matlab代码与外部工具集成解决方案,基于随机森林(RF)算法的多变量时间序列预测 外部工具箱 RF多变量时间序列 matlab代码 注:暂无Matlab版本要求 -- 推荐 2018B 版本及以上 注:采用 RF 工具箱(无需安装,可直接运行),仅支持 Windows 64位系统 ,基于随机森林(RF)算法; 多变量时间序列预测; 外部工具箱; RF多变量时间序列预测的Matlab代码; Windows 64位系统。,"基于随机森林算法的Windows多变量时间序列预测外部工具箱"