BeanUtils,PropertyUtils
转自:http://www.cnblogs.com/friends-wf/p/3720348.html
beanUtils的用法
举例1:使用BeanUtils工具封装用户提交的数据。
1 public static void main(String[] args)throws Exception { 2 3 // 模拟用户的输入的数据如下 4 5 String name = "XML基础"; 6 7 String author = "焦宁波"; 8 9 String price = "99.99"; 10 11 String date = "2013-01-04"; 12 13 Book book = new Book(); 14 15 // 任务是将以上的属性设置给指定的Book对象 16 17 BeanUtils.setProperty(book, "name", name); 18 19 BeanUtils.setProperty(book, "author", author); 20 21 BeanUtils.setProperty(book, "price",price ); 22 23 // 查看属性是否封装好 24 25 System.out.println(book); 26 27 }
发现使用上面的代码可以省略基本数据类型的转型的问题。进而提高代码的开发效率。
举例2:自定义一个类型转换器类。
1 public static void main(String[] args)throws Exception { 2 3 // 模拟用户的输入的数据如下 4 5 String name = "XML基础"; 6 7 String author = "焦宁波"; 8 9 String price = "99.99"; 10 11 String date = "2013-01-04"; 12 13 14 15 Book book = new Book(); 16 17 18 19 // 注册一个自己的转换器 20 21 /** 22 23 * converter指定具体的转换器 24 25 * clazz遇到什么类型调用上面的转换器 26 27 */ 28 29 ConvertUtils.register( 30 31 new Converter(){ 32 33 // 回调方法 34 35 @Override 36 37 public Object convert(Class type, Object value) { 38 39 if(value == null){ 40 41 return null; 42 43 } 44 45 // 转换为String 46 47 String data = (String)value; 48 49 // 将指定格式的字符串转换为Date 50 51 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 52 53 Date date = null; 54 55 try { 56 57 date = format.parse(data); 58 59 return date; 60 61 } catch (ParseException e) { 62 63 e.printStackTrace(); 64 65 return null; 66 67 } 68 69 } 70 71 }, 72 73 Date.class); 74 75 // 任务是将以上的属性设置给指定的Book对象 76 77 BeanUtils.setProperty(book, "name", name); 78 79 BeanUtils.setProperty(book, "author", author); 80 81 BeanUtils.setProperty(book, "price",price ); 82 83 BeanUtils.setProperty(book, "date",date ); 84 85 // 查看属性是否封装好 86 87 System.out.println(book); 88 89 }
如果每次遇到一个复杂类型都需要自定义转换器,那样的话实在麻烦。大家看在开发的时候可以先查看该接口是否提供了有效的实现类。
ConvertUtils.register(new DateLocaleConverter(), Date.class);
其实真正的封装好的数据需要存储在数据库中,那么javabean的数据类型应该和数据库的数据类型保持一致,那么在声明持久化javabean的时候需要全部为数据库的基本数据类型。
因此大家在JavaBean中需要导入的是java.sql.Date类,这样就直接可以将日期自动转换了。
举例3:实现封装好的JavaBean对象的属性拷贝。
1 // 实现属性封装数据的一个拷贝 2 3 Book copy = new Book(); 4 5 System.out.println(copy); 6 7 PropertyUtils.copyProperties(copy, book); 8 9 System.out.println(copy);
思考:如果使用BeanUtils封装用户的数据,那么也就是一个一个设置啊?岂不是也很麻烦?
其实在真是的环境中我们可以直接获取用户提交的所有的数据信息,只需要进行遍历即可,但是为了方便快速的设置,那么可以将javabean中的属性名和用户提交的数据名保持一致。
1、 BeanUtils一共分4个包:
org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters
其中上面两个是BeanUtils的默认实现,它没有针对本地化的任何处理,这个可以提高执行效率。
但是若你的程序对于本地化有要求的话,那还是使用下面2个包比较安全。
org.apache.commons.beanutils
这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。
2、BeanUtils可以直接get和set一个属性的值。它将property分成3种类型:
Simple——简单类型,如Stirng、Int……
Indexed——索引类型,如数组、arrayList……
Maped——这个不用说也该知道,就是指Map啦,比如HashMap……
访问不同类型的数据可以直接调用函数getProperty和setProperty。getProperty只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名;setProperty提供三个参数,第一是JavaBean对象,第二个是要操作的属性名,第三个为要设置的具体的值
(1)Simple
//对于Simple类型,参数二直接是属性名即可
System.out.println(BeanUtils.getProperty(c, "name"));
(2)Map
//对于Map类型,则需要以“属性名(key值)”的形式
System.out.println(BeanUtils.getProperty(c, "address (A2)"));
HashMap am = new HashMap();
am.put("1","234-222-1222211");
am.put("2","021-086-1232323");
BeanUtils.setProperty(c,"telephone",am);
System.out.println(BeanUtils.getProperty(c, "telephone (2)"));
Map类型也可以采用BeanUtils.getMappedProperty(c, "address","A2");
(3)index
//对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作。
System.out.println(BeanUtils.getProperty(c, "otherInfo[2]"));
BeanUtils.setProperty(c, "product[1]", "NOTES SERVER");
System.out.println(BeanUtils.getProperty(c, "product[1]"));
index类型还可以采用BeanUtils.getIndexedProperty(c,"product",1);
(4)nest 3种类也可以组合使用啦!
System.out.println(BeanUtils.getProperty(c, "employee[1].name"));
3、bean copy功能
Company c2 = new Company();
BeanUtils.copyProperties(c2, c);
但是这种copy都是浅拷贝,复制后的2个Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况
4、 BeanUtils和PropertyUtils
这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!
针对上面的例子,新建一个Company2的类,其中代码与Company一样,只是将otherinfo从String[]改为String。
Company c = init();
Company2 c2 = new Company2();
BeanUtils.copyProperties(c2,c);
// PropertyUtils.copyProperties(c2,c); 这句会报错!!
System.out.println(c2.getOtherInfo());
当然2个Bean之间的同名属性的类型必须是可以转化的,否则用BeanUtils一样会报错。
若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。
由于不做类型转化,用PropertyUtils在速度上会有很大提高!
此外,不作类型转化还有一个好处,如下面的代码:
//test data type convert
// ArrayList a1 = BeanUtils.getProperty(c,"product"); //BeanUtils返回的是String
System.out.println("--" + BeanUtils.getProperty(c,"product")); //取出后直接被转为String
ArrayList a = (ArrayList)PropertyUtils.getProperty(c,"product");//PropertyUtils返回的是Object
System.out.println("--" + a.get(1));
用BeanUtils无法返回一个对象(除非自己写一个Converter),它会自动进行类型转化,然后返回String。对于想返回java类或自定义类的话,还是请使用PropertyUtils
5、Utils类
所有的XXXUtils类都提供的是静态方法,可以直接调用,其主要实现都在相应的XXXUtilsBean中:
BeanUtils ——> BeanUtilsBean
ConvertUtils ——> ConvertUtilsBean
PropertyUtils ——> PropertyUtilsBean
(1)PropertyUtils,获取属性的Class类型
public static Class getPropertyType(Object bean, String name)
(2)ConstructorUtils,动态创建对象
public static Object invokeConstructor(Class klass, Object arg)
(3)MethodUtils,动态调用方法
MethodUtils.invokeMethod(bean, methodName, parameter);
BeanUtils,PropertyUtils相关推荐
- java BeanUtils PropertyUtils
为什么80%的码农都做不了架构师?>>> <dependency><groupId>commons-beanutils</groupId>& ...
- 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀
2019独角兽企业重金招聘Python工程师标准>>> 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀 博客分类: java 对象拷贝的应用 ...
- java beanutils 性能_对比BeanUtils、PropertyUtils、BeanCopier的性能消耗
主要代码 定义2个bean对象: public class copyPropertiesData1 { private Integer id; public Integer getId() { ret ...
- beanutils工具类_16 个超级实用的 Java 工具类!
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- java万法_Java内省机制和 BeanUtils实现
内省(Introspector) Java 语言对 Bean 类属性.事件的一种缺省处理方法. 例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的 ...
- java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)
内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...
- 跟同事杠上了,Apache Beanutils为什么被禁止使用?
收录于热门专栏Java基础教程系列(进阶篇) 在实际的项目开发中,对象间赋值普遍存在,随着双十一.秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面. 问:如果是你来写对象间赋值的代码,你 ...
- javabean,BeanUtils以及 java7的新特性 .
javabean的属性 是根据 set和get方法来 操作的,而不是根据 成员变量 来操作的.注意区别 属性 和成员变量 成员变量是私有的 看不见. 一. javabean 是什么? Bean ...
- Taglib原理和实现:再论El和JST
作者: WalkingWithJava 出处: Java研究组织 问题:你想和JSTL共同工作.比如,在用自己的标签处理一些逻辑之后,让JSTL处理余下的工作. 看这个JSP例子: <% Str ...
- java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...
最新文章
- Hadoop Shell命令
- java 集合框架快速预览
- win7win10 配置wlan热点
- 多学一招总没错吧?MP通用枚举轻松实现存储显示相分离
- 文件、文件夹操作(I)
- 如何配置Smarty模板
- 【转】Linux 移动或重命名文件/目录-mv 的10个实用例子
- 读书笔记_打开量化投资的黑箱07
- 华为机试HJ68:成绩排序
- C# Word控件 dsoframer、office viewer、pageoffice、setparent
- PDF格式转换工具百度网盘下载地址及破解方法
- Captura录屏软件使用说明
- 【美少女】阿里巴巴实习三个月总结
- 只有单号,用这个方法自动识别快递公司,快速查询出物流
- 量化投资为什么用python_1、量化投资—为什么选择Python?
- 基于微信小程序的垃圾分类小程序(源码已开源)
- c语言 ascii码转成字符串,ASCII码与字符串的相互转换
- JS实现答题上一题下一题
- python小技巧:300行代码实现俄罗斯方块
- 赛门铁克为 Google 域名颁发证书
热门文章
- 软测面试丨关于JMeter的面试问题,看这篇就够了!
- 在Oracle Data Guard环境中的RMAN备份和还原
- 我的世界Java种子大全_种子(世界生成)
- c语言编程软件我的世界,我的世界(Minecraft)
- ev3pid巡线_据说这是最简单的乐高EV3巡线方法
- 【2】基于深度神经网络的脑电睡眠分期方法研究(标签导入)
- 一种简单的睡眠评分规则
- jrtplib linux编译,linux下编译jrtplib、jthreadlib
- 十天学会单片机和c语言编程 ppt,十天学会单片机和C语言编程笔记1
- MATLAB 如何使用pascal函数创建Pascal(帕斯卡)矩阵