Java工具類BeanUtils庫介紹及實(shí)例詳解
BeanUtils工具由Apache軟件基金組織編寫,提供給我們使用,主要解決的問題是:把對(duì)象的屬性數(shù)據(jù)封裝到對(duì)象中。
在整個(gè)J2EE的編程過程中,我們經(jīng)常會(huì)從各種配置文件中讀取相應(yīng)的數(shù)據(jù),需要明白的一點(diǎn)是從配置文件中讀取到的數(shù)據(jù)都是String,但是很顯然我們的應(yīng)用程序中不僅僅有String一種數(shù)據(jù)類型,比如:基本數(shù)據(jù)類型(int、double、char、float等),還有自定義數(shù)據(jù)類型(引用數(shù)據(jù)類型),
那么我們必須面臨的一個(gè)問題就是講字符串類型轉(zhuǎn)換為各種具體的數(shù)據(jù)類型,該怎么辦呢?
有兩種方法供我們是使用:
- 首先判斷需要的數(shù)據(jù)類型,然后對(duì)字符串類型調(diào)用相應(yīng)的方法,將其轉(zhuǎn)換為我們想要的類型
- 使用BeanUtils工具
對(duì)于上面提到的兩種方法,我們分析第一種存在的問題是太過于繁瑣,每次都要進(jìn)行大量的類型轉(zhuǎn)換,Apache軟件基金會(huì)給我們提供了第二種方法,使用其提供的BeanUtils工具,具體的說只需要知道其中的兩個(gè)方法就能實(shí)現(xiàn)類型的轉(zhuǎn)換,很簡(jiǎn)單,降低了編程的難度。
導(dǎo)入包
很明顯,要想使用別人開發(fā)的工具必須將其jar包導(dǎo)入到程序中,但是BeanUtils包存對(duì)另外一個(gè)軟件包的依賴,下面將具體的顯示jar包的名字,其中的版本號(hào)不一定與我使用的相同。
請(qǐng)下載最新的版本,并把相應(yīng)的jar包導(dǎo)入到程序中,具體導(dǎo)入jar包的方法在這里就不做任何的介紹了,這屬于最基本的知識(shí),只要你在從事Java EE的項(xiàng)目開發(fā),幾乎每天都會(huì)遇到各種不同的jar包的導(dǎo)入。
在開始編寫具體的代碼之前,請(qǐng)將source導(dǎo)入到程序中,否則將不能生成正確的重載函數(shù),只需要使用吧Attach Source,將jar包(使用外部文件的方式導(dǎo)入,不要使用外部文件夾的方式導(dǎo)入)導(dǎo)入即可。
使用
Beanutils工具在使用時(shí)幾乎只用到以下幾個(gè)方法,其中一個(gè)方法通常情況下都是使用匿名內(nèi)部類。
- BeanUtils.setProperty(bean, name, value);其中bean是指你將要設(shè)置的對(duì)象,name指的是將要設(shè)置的屬性(寫成”屬性名”),value(從配置文件中讀取到到的字符串值)
- BeanUtils。copyProperties(bean, name, value),和上面的方法是完全一樣的。使用哪個(gè)都可以
- ConvertUtils.register(Converter converter , ..),當(dāng)需要將String數(shù)據(jù)轉(zhuǎn)換成引用數(shù)據(jù)類型(自定義數(shù)據(jù)類型時(shí)),需要使用此方法實(shí)現(xiàn)轉(zhuǎn)換。
- BeanUtils.populate(bean,Map),其中Map中的key必須與目標(biāo)對(duì)象中的屬性名相同,否則不能實(shí)現(xiàn)拷貝。
- BeanUtils.copyProperties(newObject,oldObject),實(shí)現(xiàn)對(duì)象的拷貝
自定義數(shù)據(jù)類型使用BeanUtils工具時(shí)必須具備的條件
自定義數(shù)據(jù)類型使用BeanUtils工具時(shí),本身必須具備getter和setter方法,因?yàn)锽eanUtils工具本身也是一種內(nèi)省的實(shí)現(xiàn)方法,所以也是借助于底層的getter和setter方法進(jìn)行轉(zhuǎn)換的。
實(shí)例
想要封裝成javabean的對(duì)象
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 "編號(hào):"+this.id+" 姓名:"+this.name+" 工資:"+this.salary+" 生日:"+date;
}
}
使用BeanUtils組件進(jìn)行轉(zhuǎn)換
/**
* BeanUtils工具的使用
* 功能:BeanUtils主要是用于將對(duì)象的屬性封裝到對(duì)象中
* BeanUtils的好處:
* BeanUtils設(shè)置屬性值的時(shí)候,如果屬性是基本數(shù)據(jù)類型,那么BeanUtils會(huì)自動(dòng)幫我們進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,并且
* BeanUtils設(shè)置屬性的時(shí)候也是依賴于底層的getter和setter方法
*
* 如果設(shè)置的屬性值是其他的引用數(shù)據(jù)類型,此時(shí)必須要注冊(cè)一個(gè)類型轉(zhuǎn)換器才能實(shí)現(xiàn)自動(dòng)的轉(zhuǎn)換
* */
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 {
//從文件中讀取到的數(shù)據(jù)都是字符串的數(shù)據(jù),或者是表單提交的數(shù)據(jù)獲取到的時(shí)候也是字符串?dāng)?shù)據(jù)
//在J2EE的編程中,我們會(huì)通過配置文件或者直接從文件獲取數(shù)據(jù)的方式得到我們想要的數(shù)據(jù)
//那么就存在一個(gè)問題,當(dāng)我們需要的是一個(gè)int時(shí),讀到的數(shù)據(jù)確是String,那么我們每次是不是都要先判斷實(shí)際
//需要的是什么數(shù)據(jù)類型,然后進(jìn)行一個(gè)強(qiáng)制的類型轉(zhuǎn)換呢?回答是不需要,我們借助Apache軟件基金會(huì)提供的BeanUtils工具
//根本不用管什么樣的數(shù)據(jù)類型,只需要使用BeanUtils的setProperties方法,該方法有三個(gè)參數(shù),對(duì)三個(gè)參數(shù)進(jìn)行設(shè)置便會(huì)
//實(shí)現(xiàn)自動(dòng)的數(shù)據(jù)類型轉(zhuǎn)換
/*ConvertUtils.register(new Converter() {
//自定義日期類型轉(zhuǎn)換器
@Override
public Object convert(Class type, Object value) { //type:目前需要轉(zhuǎn)換的數(shù)據(jù)類型 value:目前參數(shù)的值
//目標(biāo):將字符串轉(zhuǎn)換為日期
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表示要轉(zhuǎn)換的成引用類型,Date類型不是基本數(shù)據(jù)類型,所以需要一個(gè)轉(zhuǎn)換器進(jìn)行相應(yīng)的轉(zhuǎn)換,同樣該功能屬于BeanUtils
*/
//使用日起轉(zhuǎn)換器工具類
ConvertUtils.register(new DateLocaleConverter(), Date.class); //不靈活,自己實(shí)現(xiàn)最好
String id ="110"; //我們用這個(gè)三個(gè)String類型的屬性代表從配置文件中讀取到的數(shù)據(jù),實(shí)際編程過程中這些數(shù)據(jù)直接從properties文件中讀取
String name = "朱君鵬";
String salary = "1000";
// String birthday = "2015年01月30日"; //如果要使用工具中提供的轉(zhuǎn)換器必須要符合一定的格式,像這種格式就不能實(shí)現(xiàn)轉(zhuǎn)換
String birthday = "2015-01-30"; //該格式可以實(shí)現(xiàn)使用工具提供的轉(zhuǎn)換器類將字符串正確的轉(zhuǎn)換,
Emp p = new Emp(); //讀取到數(shù)據(jù)之后,對(duì)該對(duì)象的屬性進(jìn)行設(shè)置,使用BeanUtils工具可以避免強(qiáng)制類型的轉(zhuǎn)換,但是在Emp類中的每個(gè)屬性都要有g(shù)etter和setter方法
//因?yàn)锽eanUtils工具實(shí)際上是對(duì)內(nèi)省的封裝,使其更加的好用,所以其底層還是依賴getter和setter方法
BeanUtils.setProperty(p, "id", id); //其中p代表的是要設(shè)置的對(duì)象
BeanUtils.setProperty(p, "name", name); //中間一個(gè)參數(shù)代表的是要設(shè)置的屬性
BeanUtils.setProperty(p, "salary", salary); //第三個(gè)參數(shù)代表的是第二個(gè)屬性的值
BeanUtils.setProperty(p, "date", birthday);
System.out.println(p);
}
}
更多關(guān)于Java類庫BeanUtils使用方法及實(shí)例請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
Java的MyBatis框架中MyBatis Generator代碼生成器的用法
這篇文章主要介紹了Java的MyBatis框架中Mybatis Generator代碼生成器的用法,Mybatis Generator主要被用來生成繁瑣的配置文件來提高效率,需要的朋友可以參考下2016-04-04
如何在Java中創(chuàng)建線程通信的四種方式你知道嗎
開發(fā)中不免會(huì)遇到需要所有子線程執(zhí)行完畢通知主線程處理某些邏輯的場(chǎng)景。或者是線程 A 在執(zhí)行到某個(gè)條件通知線程 B 執(zhí)行某個(gè)操作。下面我們來一起學(xué)習(xí)如何解決吧2021-09-09
@PathParam和@QueryParam區(qū)別簡(jiǎn)析
這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關(guān)實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置
在微服務(wù)搭建中經(jīng)常會(huì)使用到多數(shù)據(jù)庫情形這個(gè)時(shí)候,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
screw?Maven插件方式運(yùn)行時(shí)在編譯打包時(shí)跳過執(zhí)行的問題解決方法
這篇文章主要介紹了screw?Maven插件方式運(yùn)行時(shí)在編譯打包時(shí)跳過執(zhí)行的問題解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
SpringCloud使用FFmpeg對(duì)視頻壓縮處理的代碼示例
在現(xiàn)代的視頻處理系統(tǒng)中,壓縮視頻以減小存儲(chǔ)空間、加快傳輸速度是一項(xiàng)非常重要的任務(wù),FFmpeg作為一個(gè)強(qiáng)大的開源工具,廣泛應(yīng)用于音視頻的處理,包括視頻的壓縮和格式轉(zhuǎn)換等,本文將通過Java代碼示例,向您展示如何使用FFmpeg進(jìn)行視頻壓縮,并介紹相關(guān)參數(shù)的設(shè)置2024-11-11
詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法
本文主要介紹了詳解Spring Cloud Zuul網(wǎng)關(guān)修改為短連接方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

