BeanUtils使用

一、BeanUtils概要

  BeanUtils是由Apache公司所开发的工具包,目的是为了简化数据封装,方便Java程序员对JavaBean类进行简便的操作。

注意事项

  • 被封装的JavaBean必须是标准的Java类
    1. 该JavaBean必须被public所修饰
    2. 必须提供空构造器
    3. 成员变量必须私有化,被private所修饰
    4. 提供公共的settergetter方法

1.1BeanUtils工具JAR包

  1. commons-beanutils-*.jar
  1. commons-logging-*.jar

1.1.1下载beanutils

选择其中一个下载

得到一个.gz的压缩包:

解压.gz的压缩包:

commons-beanutils-1.9.4.jar引入(复制)到项目lib目录下,右键jar包选择Add as library


1.1.2下载logging

commons-logging的下载和导入同理

下载页面 | commons-logging-1.2下载地址

进其导入lib目录下:


1.2关于属性和成员变量

不少人将属性成员变量混为一谈。在这里简单说明一下两者的异同和联系。

  1. 差异:
  • 成员变量
    简单来说就是定义在方法之间的变量

  • 属性
    在JavaBean中,去掉getset后得到的字符串,将其首字母小写后即为属性。如:getUsername() --> Username --> username, username即为该JavaBean的一个属性。

  1. 联系:

  可能你已经注意到,这个username属性和username成员变量是一样的。这是一般情况(标准)下,实际上,两者的联系是:属性的存在是用于操纵或者获取成员变量的,所以说,相应的settergetter方法可能会不同,即可以使用setAbc(String username)来设置username成员变量,而这里的abc就是属性。

  通常情况下,我们的属性和成员变量的名称是相同的,在没有特殊的要求下,推荐这样的编写方式。


二、BeanUtils简单使用

BeanUtils提供了对于JavaBean进行各种操作,比如对象、属性复制等。

  BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型转换,并且BeanUtils设置属性的时候也是依赖于底层的getter和setter方法。如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换(参考下面的ConvertUtils)


2.1常用方法

参考文档(英文):解压commons-beanutils-1.9.4.jar后即可得到。

方法名称 描述信息
populate(Object bean, Map<String,? extends Object> properties) 根据指定的名称/值对填充指定Bean的JavaBeans属性。
setProperty(Object bean, String name, Object value) 设置指定属性的值
copyProperty(Object bean, String name, Object value) 拷贝指定的属性值到指定的bean
copyProperties(Object dest, Object orig) 对象的拷贝
cloneBean(Object bean) 对象的克隆

2.2实例

创建一个JavaBean类

pulic class User{
    private String username;
    private String password;
    private Date birthday;

    public User(){}

    pulic void setUsername(String username){
        this.username = username;
    }
    pulic String getUsername(){
        retrun this.username;
    }

    pulic void setPassword(String password){
        this.password= password;
    }
    pulic String getPassword(){
        retrun this.password;
    }
    pulic void setPassword(Date birthday){
        this.birthday= birthday;
    }
    pulic Date getPassword(){
        retrun this.birthday;
    }
}
  1. BeanUtils.populate(Object bean, Map<String,? extends Object> properties)

根据指定的名称/值对填充指定Bean的JavaBeans属性。

User user = new User(); // 被封装的JavaBean
Map<String, String[]> loginUser = request.getParameterMap(); // 封装的数据Map集合
/* 等价:
 *     Map<String, String> loginUser = new HasheMap<>();
 *     loginUser.put("username","langkye");
 *     loginUser.put("password","admin");
 */
BeanUtils.populate(user,loginUser);
System.out.println(user); // 输出:User{username='langkye', password='admin', birthday=null}

  1. BeanUtils.setProperty(Object bean, String name, Object value)

设置指定属性的值

User user = new User(); // 被封装的JavaBean
BeanUtils.setProperty(user,"username","langkye"); // 设置username属性
BeanUtils.setProperty(user,"password","admin"); // 设置password属性
System.out.println(user); // 输出:User{username='langkye', password='admin', birthday=null}

  1. BeanUtils.copyProperty(Object bean, String name, Object value)

拷贝指定的属性值到指定的bean

User user1 = new User();
BeanUtils.copProperties(user1, "username","langkye");
System.out.println(user1); // 输出:User{username='langkye', password=null, birthday=null}

  1. BeanUtils.copyProperties(Object dest, Object orig)

对象的拷贝

// 对象的拷贝
User user2 = new User();
BeanUtils.copyProperties(user, user2);
System.out.println(user1); // 输出:User{username='langkye', password='admin', birthday=null}

  1. BeanUtils.cloneBean(Object bean)

对象的克隆

// 克隆对象
User user3 = (User)BeanUtils.cloneBean(user);
System.out.println(user3); // 输出:User{username='langkye', password='admin', birthday=null}

三、ConvertUtils简单使用

ConvertUtils为类型转换工具类

ConvertUtils可以使字符串和指定类型的实例之间进行转换。 实际上,BeanUtils是依赖ConvertUtils来完成类型转换,但是有时候我们可能需要自定义转换器来完成特殊需求的类型转换;

3.1 常用方法

方法 描述
convert(Object value, Class<?> targetType) 将给定的value转换成指定的Class类型
register(Converter converter, Class clazz) 给BeanUtils注册指定类型的转换器

3.2字符串和Date类型转换

  1. convert(Object value, Class<?> targetType)
// 将日期转换成字符串
String DateStr = (String)ConvertUtils.convert(new Date(), String.class);
System.out.println(DateStr); // Fri May 20 00:00:00 CST 2050
System.out.println((ConvertUtils.convert(new Date(), String.class)).getClass().getTypeName()); // java.lang.String
  1. register(Converter converter, Class clazz)
Map<String,String> paraMap = new HashMap<>().put("birthday","2050-05-20");
// 将字符串转换为日期类型
DateConverter dc = new DateConverter();
dc.setPattern("yyyy-MM-dd");
ConvertUtils.register(dc,Date.class);
BeanUtils.populate(user4,paraMap);
System.out.println(user4); // User {username=null,password=null,birthday='Fri May 20 00:00:00 CST 2050'}

3.3 字符串和Double

// 将字符串转换成Double
Double doubleNumber = (Double)ConvertUtils.convert("2050", Double.class);
System.out.println(doubleNumber); // 2050.0
String dn_typeName = doubleNumber.getClass().getTypeName();
System.out.println(dn_typeName); // java.lang.Double
原文地址:https://www.cnblogs.com/langkyeSir/p/13201381.html