电竞比分网-中国电竞赛事及体育赛事平台

分享

Java面向?qū)ο蟆狫avaBean內(nèi)省

 岑經(jīng)滄海難為水 2014-07-22

面向?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...。

給抽取后的方法取一個名字,然后點擊OK。

代碼示例:

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多