1. 程式人生 > 程式設計 >Java工具類BeanUtils庫介紹及例項詳解

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,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使用方法及例項請檢視下面的相關連結