面向?qū)ο?/span> 初識JavaBean與內(nèi)省
JavaBean是一種特殊的Java類,主要用于傳遞數(shù)據(jù)信息,這種Java類中的方法主要用于訪問私有的字段,且方法名符合某種命名規(guī)則。 JavaBean的應(yīng)用情景
如果要在兩個模塊之間傳遞多個信息,可以將這些信息封裝到一個JavaBean中,這種JavaBean的實例對象通常稱之為值對象(Value Object,簡稱VO)。這些信息在類中用私有字段來存儲,如果讀取或設(shè)置這些字段的值,則需要通過一些相應(yīng)的方法來訪問。 JavaBean的規(guī)則
JavaBean的屬性是根據(jù)其中的setter和getter方法來確定的,而不是根據(jù)其中的成員變量。如果方法名為setId,中文意思即為設(shè)置id,至于你把它存到哪個變量上,則不用管。如果方法名為getId,中文意思即為獲取id,至于你從哪個變量上取,也不用管。去掉set前綴,剩余部分就是屬性名,如果剩余部分的第二個字母是小寫的,則把剩余部分的首字母改成小的。 例如:
setId()的屬性名:id
isEmpty()的屬性名:empty
setCPU的屬性名:CPU
gettime的屬性名:time
總之,一個類被當(dāng)作JavaBean使用時,JavaBean的屬性是根據(jù)方法名推斷出來的,它根本看不到Java類內(nèi)部的成員變量。
一個符合JavaBean特點的類可以當(dāng)作普通類一樣進行使用,但把它當(dāng)JavaBean用肯定需要帶來一些額外的好處,我們才會去了解和應(yīng)用JavaBean! JavaBean的好處
好處如下:
1、在Java EE開發(fā)中,經(jīng)常要使用到JavaBean。很多環(huán)境就要求按JavaBean方式進行操作,別人都這么用和要求這么做,那你就沒什么挑選的余地!
2、JDK中提供了對JavaBean進行操作的一些API,這套API就稱為內(nèi)省。如果要你自己去通過getX方法來訪問私有的x,怎么做,有一定難度吧?用內(nèi)省這套API操作JavaBean比用普通類的方式更方便。
對JavaBean的簡單內(nèi)省操作
通過內(nèi)省的方式對Person對象中的成員變量進行讀寫操作。
并對生成的代碼進行重構(gòu)。
通過反射對某個屬性進行讀寫操作的代碼可以抽取為通用方法,通過MyEclipse可以非常輕松實現(xiàn)這個功能。
步驟如下:選中需要重構(gòu)的代碼,右擊-->Refactor-->Extract Method...。
代碼示例:
package com.tuozou.day01; public class Person {
private String name; private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age; }
} package com.tuozou.day01; import java.beans.PropertyDescriptor; import java.lang.reflect.Method;
public class IntroSpector {
public static void main(String[] args)throws Exception {
Person p = new Person(); setProperty(p, "age", 21);
Object obj = getProperty(p,"age");
System.out.println(obj);
} private static Object getProperty(Object obj,String propertyName) throws Exception {
PropertyDescriptor pd =new PropertyDescriptor(propertyName,obj.getClass());
Method methodGetAge = pd.getReadMethod();
Object retVal = methodGetAge.invoke(obj);
return retVal;
} private static void setProperty(Object obj,String propertyName,int value) throws Exception{
PropertyDescriptor pd =new PropertyDescriptor(propertyName,obj.getClass());
Method methodSetAge = pd.getWriteMethod();
methodSetAge.invoke(obj, value);
}
}
注意:抽取方法之后,為了使抽取后的方法具備通用性,一定要把方法中某些參數(shù)設(shè)置為Object類型。
對JavaBean的復(fù)雜內(nèi)省操作
采用遍歷BeanInfo的所有屬性方式來查找和設(shè)置某個對象的屬性。在程序中把一個類當(dāng)作JavaBean來看,就是調(diào)用IntroSpector.getBeanInfo方法, 得到的BeanInfo對象封裝了把這個類當(dāng)作JavaBean看的結(jié)果信息。
package com.tuozou.day01; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class JavaBeansOrd {
public static void main(String[] args) throws Exception {
Person p = new Person(); Object age = getPropertyTo(p,"age"); System.out.println(age);
} private static Object getPropertyTo(Object obj,String propertyName) throws Exception {
PropertyDescriptor pd =new PropertyDescriptor(propertyName,obj.getClass()); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; for (PropertyDescriptor p : pds) {
if(pd.getName().equals(propertyName)) {
Method methodGetAge = pd.getReadMethod(); retVal = methodGetAge.invoke(obj); break;
}
} return retVal; }
}
使用BeanUtils工具包操作JavaBean
使用BeanUtils工具包首先要導(dǎo)入jar包。
步驟:
1、www.官網(wǎng)下載工具包
2、在工程下創(chuàng)建一個lib文件夾-->將beanutils的jar包拷貝到其中-->右擊該jar包-->Build Path-->Add to Build Path。


編寫代碼,可以發(fā)現(xiàn)使用BeanUtils工具包可以很容易實現(xiàn)與上面的代碼相同的效果。
package com.tuozou.day01; import org.apache.commons.beanutils.BeanUtils; public class JavaBeans {
public static void main(String[] args)throws Exception {
Person p = new Person();
BeanUtils.setProperty(p,"name", "Xcc");
String name =BeanUtils.getProperty(p,"name")
.getClass().getName();
System.out.println(name);
name = BeanUtils.getProperty(p,"name");
System.out.println(name);
BeanUtils.setProperty(p,"birthday.time","2014");
String birthday = BeanUtils.getProperty(p,"birthday.time");
System.out.println(birthday);
}
}
注意:
1-BeanUtils工具類在對對象的屬性進行操作的時候,會自動進行類型轉(zhuǎn)換。 但是設(shè)置屬性值的時候傳入的參數(shù)卻可以是String類型,這是因為內(nèi)部發(fā)生了自動類型轉(zhuǎn)換。 2-BeanUtils工具類可以對屬性進行級聯(lián)操作,例如Date(java.util.Date)類中有setTime方法,那么也就相當(dāng)于Date類型對象有一個time屬性,BeanUtils就可以對其進行操作。
圖例:

PropertyUtils類也可以操作對象的屬性,但是與BeanUtils不同的是它不能進行自動類型轉(zhuǎn)換。
例如Person類中的age屬性為int類型,但是設(shè)置屬性值的時候傳入的參數(shù)就不可以是String類型。

如果設(shè)置成了String類型,那么將會報錯。

轉(zhuǎn)自 http://bbs.csdn.net/home
|