Java工具类BeanUtils库介绍及实例详解

 更新时间:2020年02月20日 14:09:38   作者:朱君鹏  
这篇文章主要介绍了Java工具类BeanUtils库介绍及实例详解,需要的朋友可以参考下

BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中。

在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),

那么我们必须面临的一个问题就是讲字符串类型转换为各种具体的数据类型,该怎么办呢?

有两种方法供我们是使用:

  • 首先判断需要的数据类型,然后对字符串类型调用相应的方法,将其转换为我们想要的类型
  • 使用BeanUtils工具

对于上面提到的两种方法,我们分析第一种存在的问题是太过于繁琐,每次都要进行大量的类型转换,Apache软件基金会给我们提供了第二种方法,使用其提供的BeanUtils工具,具体的说只需要知道其中的两个方法就能实现类型的转换,很简单,降低了编程的难度。

导入包

很明显,要想使用别人开发的工具必须将其jar包导入到程序中,但是BeanUtils包存对另外一个软件包的依赖,下面将具体的显示jar包的名字,其中的版本号不一定与我使用的相同。

commons-beanutils-1.9.2.jar

commons-logging.jar

请下载最新的版本,并把相应的jar包导入到程序中,具体导入jar包的方法在这里就不做任何的介绍了,这属于最基本的知识,只要你在从事Java EE的项目开发,几乎每天都会遇到各种不同的jar包的导入。

在开始编写具体的代码之前,请将source导入到程序中,否则将不能生成正确的重载函数,只需要使用吧Attach Source,将jar包(使用外部文件的方式导入,不要使用外部文件夹的方式导入)导入即可。

使用

Beanutils工具在使用时几乎只用到以下几个方法,其中一个方法通常情况下都是使用匿名内部类。

  • BeanUtils.setProperty(bean, name, value);其中bean是指你将要设置的对象,name指的是将要设置的属性(写成”属性名”),value(从配置文件中读取到到的字符串值)
  • BeanUtils。copyProperties(bean, name, value),和上面的方法是完全一样的。使用哪个都可以
  • ConvertUtils.register(Converter converter , ..),当需要将String数据转换成引用数据类型(自定义数据类型时),需要使用此方法实现转换。
  • BeanUtils.populate(bean,Map),其中Map中的key必须与目标对象中的属性名相同,否则不能实现拷贝。
  • BeanUtils.copyProperties(newObject,oldObject),实现对象的拷贝

自定义数据类型使用BeanUtils工具时必须具备的条件

自定义数据类型使用BeanUtils工具时,本身必须具备getter和setter方法,因为BeanUtils工具本身也是一种内省的实现方法,所以也是借助于底层的getter和setter方法进行转换的。

实例

想要封装成javabean的对象

package com.jpzhutech.beanutils;

import java.util.Date;

import javax.xml.crypto.Data;

public class Emp {
  private int id ;
  private String name;
  public Emp(int id, String name, double salary, Date date) {
    super();
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.date = date;
  }

  private double salary;
  private Date date;


  public Date getDate() {
    return date;
  }
  public void setDate(Date date) {
    this.date = date;
  }
  public Emp() {

  }

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public double getSalary() {
    return salary;
  }
  public void setSalary(double salary) {
    this.salary = salary;
  }


  @Override
  public String toString() {
    // TODO Auto-generated method stub
    return "编号:"+this.id+" 姓名:"+this.name+" 工资:"+this.salary+" 生日:"+date;
  }

}

使用BeanUtils组件进行转换

/**
 * BeanUtils工具的使用
 * 功能:BeanUtils主要是用于将对象的属性封装到对象中
 * BeanUtils的好处:
 * BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且
 * BeanUtils设置属性的时候也是依赖于底层的getter和setter方法
 * 
 * 如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换
 * */

package com.jpzhutech.beanutils;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.crypto.Data;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class TestBeanUtils {
  public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
    //从文件中读取到的数据都是字符串的数据,或者是表单提交的数据获取到的时候也是字符串数据
    //在J2EE的编程中,我们会通过配置文件或者直接从文件获取数据的方式得到我们想要的数据
    //那么就存在一个问题,当我们需要的是一个int时,读到的数据确是String,那么我们每次是不是都要先判断实际
    //需要的是什么数据类型,然后进行一个强制的类型转换呢?回答是不需要,我们借助Apache软件基金会提供的BeanUtils工具
    //根本不用管什么样的数据类型,只需要使用BeanUtils的setProperties方法,该方法有三个参数,对三个参数进行设置便会
    //实现自动的数据类型转换

    /*ConvertUtils.register(new Converter() {


      //自定义日期类型转换器
      @Override
      public Object convert(Class type, Object value) { //type:目前需要转换的数据类型 value:目前参数的值
        //目标:将字符串转换为日期

        if(type != Date.class) return null;

        if (value == null || "".equals(value.toString().trim())) {
          return null;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = null;
        try {
           date = dateFormat.parse((String)value);
        } catch (ParseException e) {
          throw new RuntimeException(e);
        }
        return date;
      }
    }, Date.class); //Date.class表示要转换的成引用类型,Date类型不是基本数据类型,所以需要一个转换器进行相应的转换,同样该功能属于BeanUtils
    */

    //使用日起转换器工具类
    ConvertUtils.register(new DateLocaleConverter(), Date.class);  //不灵活,自己实现最好

    String id ="110"; //我们用这个三个String类型的属性代表从配置文件中读取到的数据,实际编程过程中这些数据直接从properties文件中读取
    String name = "朱君鹏";
    String salary = "1000";
//    String birthday = "2015年01月30日"; //如果要使用工具中提供的转换器必须要符合一定的格式,像这种格式就不能实现转换
    String birthday = "2015-01-30"; //该格式可以实现使用工具提供的转换器类将字符串正确的转换,


    Emp p = new Emp(); //读取到数据之后,对该对象的属性进行设置,使用BeanUtils工具可以避免强制类型的转换,但是在Emp类中的每个属性都要有getter和setter方法
               //因为BeanUtils工具实际上是对内省的封装,使其更加的好用,所以其底层还是依赖getter和setter方法

    BeanUtils.setProperty(p, "id", id); //其中p代表的是要设置的对象

    BeanUtils.setProperty(p, "name", name);  //中间一个参数代表的是要设置的属性

    BeanUtils.setProperty(p, "salary", salary); //第三个参数代表的是第二个属性的值

    BeanUtils.setProperty(p, "date", birthday);

    System.out.println(p);
  }
}

更多关于Java类库BeanUtils使用方法及实例请查看下面的相关链接

相关文章

  • 详解Java中Callable和Future的区别

    详解Java中Callable和Future的区别

    这篇文章主要介绍了Java中Callable和Future的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-11-11
  • Java虚拟机处理异常的最佳方式

    Java虚拟机处理异常的最佳方式

    这篇文章主要给大家介绍了关于Java虚拟机处理异常的最佳方式,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Java的MyBatis框架中MyBatis Generator代码生成器的用法

    Java的MyBatis框架中MyBatis Generator代码生成器的用法

    这篇文章主要介绍了Java的MyBatis框架中Mybatis Generator代码生成器的用法,Mybatis Generator主要被用来生成繁琐的配置文件来提高效率,需要的朋友可以参考下
    2016-04-04
  • 如何在Java中创建线程通信的四种方式你知道吗

    如何在Java中创建线程通信的四种方式你知道吗

    开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。下面我们来一起学习如何解决吧
    2021-09-09
  • 浅析Spring4新特性概述

    浅析Spring4新特性概述

    Spring 4.1并没有特别吸引眼球的地方,主要还是增强和一些依赖的版本升级。本文重点给大家介绍Spring4新特性概述,感兴趣的朋友一起看看吧
    2017-09-09
  • @PathParam和@QueryParam区别简析

    @PathParam和@QueryParam区别简析

    这篇文章主要介绍了@PathParam和@QueryParam区别,分享了相关实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java实战之用hutool-db实现多数据源配置

    Java实战之用hutool-db实现多数据源配置

    在微服务搭建中经常会使用到多数据库情形这个时候,下面这篇文章主要给大家介绍了关于Java实战之用hutool-db实现多数据源配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    这篇文章主要介绍了screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • SpringCloud使用FFmpeg对视频压缩处理的代码示例

    SpringCloud使用FFmpeg对视频压缩处理的代码示例

    在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务,FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等,本文将通过Java代码示例,向您展示如何使用FFmpeg进行视频压缩,并介绍相关参数的设置
    2024-11-11
  • 详解Spring Cloud Zuul网关修改为短连接方法

    详解Spring Cloud Zuul网关修改为短连接方法

    本文主要介绍了详解Spring Cloud Zuul网关修改为短连接方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论