JavaBean

JavaBean

標籤(空格分隔): Java


什麼是JavaBean

  JavaBean是一種特殊的Java類,它主要用於傳遞數據信息,此類中的方法按照某種規則命名。這種用於傳遞信息的對象通常被稱爲值對象(Value Object, VO),這些信息在類中用私有字段來存儲,並通過set和get方法來進行訪問。

private int x;
int getAge(){...}
void setAge(int age){...}

  把Person作爲一個JavaBean開看,可以視其爲其擁有一個age屬性,而具體這個屬性是如何存儲或得來的,我們並不知道,也不需要去關注。即對於JavaBean,外部組件通過其get/set方法來推斷其所擁有的屬性,即截取getXxx和setXxx中Xxx部分並把第一個字母改爲小寫,來作爲其屬性名(如果第二個字母爲小寫,則把最後一個字母變爲小寫)。因此對於JavaBean來說,其get和set方法後的名稱應該儘量與其屬性名完全一致。例如:

  • getAge –> age
  • getCPU —> CPU
  • getname –> name

Person類:

class Person{
    private int x;
    public int getAge(){
        return x;
    }
    public void setAge(int age){
        this.x = age;
    }
}

使用內省操作JavaBean

  一個符合JavaBean特點的類依然可以當做普通類一樣進行使用,但把其當做JavaBean來處理可以獲得一些額外的便利:

  1. Java EE開發中,經常要用到JavaBean,很多環境下都要求按照JavaBean來操作。
  2. JDK中提供了對JavaBean進行操作的一些API,這套API稱之爲內省。使用內省可以使得對JavaBean的操作更加便利。

使用內省方法獲得JavaBean對象屬性值

  使用內省,需要使用到java.beans軟件包。其中的PropertyDescriptor類提供了根據get/set方法操作屬性的功能,即getReadMethod() / getWriteMethod(),他們返回get/set方法的Method對象,使用getName()方法可以獲取對應的屬性名。

Person person = new Person(18);
//PropertyDescriptor 描述 Java Bean 通過一對存儲器方法導出的一個屬性。
PropertyDescriptor pd = newPropertyDescriptor("age", person.getClass());
Method methodGetAge = pd.getReadMethod();
Object retVal = methodGetAge.invoke(person);
System.out.println(retVal);

Method methodSetAge = pd.getWriteMethod();
methodSetAge.invoke(person, 28); // 28 Auto-Boxing
System.out.println(person.getX());

使用內省的另一種方法

  使用java.beans.Introspector類,這是一個工具類,裏面包含的都是static方法,沒有構造器。其中的getBeanInfo(person.getClass())方法可以獲得一個對此JavaBean進行描述的BeanInfo類。   BeanInfo對象的getPropertyDescriptors()方法可以返回此JavaBean的所有屬性的PropertyDescriptor對象。這種方式相比第一種複雜一些,但是第一種只適用於已知此javabean中具有的屬性並希望對其操作的情況,而這種複雜的方法可以在未知JavaBean信息的情況下,動態獲得其所有的信息,並對其進行操作。

//使用Introspector工具類來獲取BeanInfo對象,然後獲取所有的屬性和方法描述。

BeanInfo info = Introspector.getBeanInfo(person.getClass());
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
    if(pd.getName().equals(“age”)){
                   sop(pd.getReadMethod().invoke(person));
                   break;
    }
}

使用Beanutils操作JavaBean

  Beanutils是apache開發的一套開源工具包,用於進一步簡化對JavaBean的操作。通過使用beanutils這個工具包,我們可以象訪問Map一樣來訪問javabean。所以,beanutils工具包是javabean與map之間的一座橋。這個工具包就是爲了struts而生而存在的。
  要使用beanutils工具包,需要去網上下載對應的工具包commons-beanutils-current,解壓后里麪包含一些用戶文檔,還有三個版本的jar包,一個完全的,一個部分的,一個精巧的。需要把需要的jar包添加進eclipse工程下。
  注意:要使用beanutils包,還需要再添加一個apache公司的另一個日誌工具包,commons-logging。

使用BeanUils工具類就可以完成對屬性的get/set操作。

BeanUtils.getProperty(person, "age");
BeanUtils.setProperty(person, "age","38");

注意:set和get的值都是字符串。這是爲了方便實際Web應用。

級聯set/get

  BeanUtils.setProperty(javaBean, "屬性名.屬性名","value");
  即設置屬性的屬性。屬性名要賦初值,不然會報無效的屬性異常。
在Person中定義private Date birthday;

BeanUtils.setProperty(person,"birthday.time","111");
BeanUtils.getProperty(person,"birhday.time");

其他方法

  使用copyProperties(目標對象,源對象)來將後一個對象的屬性拷貝到前一個對象中。
  使用describe(目標對象)可以將一個javabean轉換爲一個map。
  使用populate(javaBean,Map)將一個map的值填充到javabean中。
  可以直接使用BeanUtils的方法操作map:

Map map = {name : "zxx", age :18}; //java 7 新特性
BeanUtils.setProperty(map,"name", "lhm");
PropertyUtils.setProperty(javaBean, "屬性名", value);
valueType value =PropertyUtils.getProperty(javaBean, "屬性");

  注意PropertyUtils類操作屬性時,set和get都是使用的屬性的實際類型,而沒有轉換爲字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章