转自: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对象,第二个是要操作的属性名,第三个为要设置的具体的值

public class Company { private String name; private HashMap address = new HashMap(); private String[] otherInfo; private ArrayList product; private ArrayList employee; private HashMap telephone; public Company(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress(String type) { return address.get(type).toString(); } public void setAddress(String type, String address) { this.address.put(type,address); } public String[] getOtherInfo() { return otherInfo; } public void setOtherInfo(String[] otherInfo) { this.otherInfo = otherInfo; } public ArrayList getProduct() { return product; } public void setProduct(ArrayList product) { this.product = product; } public ArrayList getEmployee() { return employee; } public void setEmployee(ArrayList employee) { this.employee = employee; } public HashMap getTelephone() { return telephone; } public void setTelephone(HashMap telephone) { this.telephone = telephone; } }  

(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相关推荐

  1. java BeanUtils PropertyUtils

    为什么80%的码农都做不了架构师?>>>    <dependency><groupId>commons-beanutils</groupId>& ...

  2. 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀

    2019独角兽企业重金招聘Python工程师标准>>> 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀 博客分类: java 对象拷贝的应用 ...

  3. java beanutils 性能_对比BeanUtils、PropertyUtils、BeanCopier的性能消耗

    主要代码 定义2个bean对象: public class copyPropertiesData1 { private Integer id; public Integer getId() { ret ...

  4. beanutils工具类_16 个超级实用的 Java 工具类!

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  5. java万法_Java内省机制和 BeanUtils实现

    内省(Introspector) Java 语言对 Bean 类属性.事件的一种缺省处理方法. 例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的 ...

  6. java bean的反射类_JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  7. 跟同事杠上了,Apache Beanutils为什么被禁止使用?

    收录于热门专栏Java基础教程系列(进阶篇) 在实际的项目开发中,对象间赋值普遍存在,随着双十一.秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面. 问:如果是你来写对象间赋值的代码,你 ...

  8. javabean,BeanUtils以及 java7的新特性 .

    javabean的属性 是根据 set和get方法来 操作的,而不是根据  成员变量 来操作的.注意区别   属性 和成员变量  成员变量是私有的 看不见. 一. javabean 是什么? Bean ...

  9. Taglib原理和实现:再论El和JST

    作者: WalkingWithJava 出处: Java研究组织 问题:你想和JSTL共同工作.比如,在用自己的标签处理一些逻辑之后,让JSTL处理余下的工作. 看这个JSP例子: <% Str ...

  10. java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...

最新文章

  1. Hadoop Shell命令
  2. java 集合框架快速预览
  3. win7win10 配置wlan热点
  4. 多学一招总没错吧?MP通用枚举轻松实现存储显示相分离
  5. 文件、文件夹操作(I)
  6. 如何配置Smarty模板
  7. 【转】Linux 移动或重命名文件/目录-mv 的10个实用例子
  8. 读书笔记_打开量化投资的黑箱07
  9. 华为机试HJ68:成绩排序
  10. C# Word控件 dsoframer、office viewer、pageoffice、setparent
  11. PDF格式转换工具百度网盘下载地址及破解方法
  12. Captura录屏软件使用说明
  13. 【美少女】阿里巴巴实习三个月总结
  14. 只有单号,用这个方法自动识别快递公司,快速查询出物流
  15. 量化投资为什么用python_1、量化投资—为什么选择Python?
  16. 基于微信小程序的垃圾分类小程序(源码已开源)
  17. c语言 ascii码转成字符串,ASCII码与字符串的相互转换
  18. JS实现答题上一题下一题
  19. python小技巧:300行代码实现俄罗斯方块
  20. 赛门铁克为 Google 域名颁发证书

热门文章

  1. 软测面试丨关于JMeter的面试问题,看这篇就够了!
  2. 在Oracle Data Guard环境中的RMAN备份和还原
  3. 我的世界Java种子大全_种子(世界生成)
  4. c语言编程软件我的世界,我的世界(Minecraft)
  5. ev3pid巡线_据说这是最简单的乐高EV3巡线方法
  6. 【2】基于深度神经网络的脑电睡眠分期方法研究(标签导入)
  7. 一种简单的睡眠评分规则
  8. jrtplib linux编译,linux下编译jrtplib、jthreadlib
  9. 十天学会单片机和c语言编程 ppt,十天学会单片机和C语言编程笔记1
  10. MATLAB 如何使用pascal函数创建Pascal(帕斯卡)矩阵