天天看點

内省與javaBean

java中的内省

     為了讓程式員們更好的操作java對象的屬性,sun公司開發了一套api,被業界内稱為:内省;内省的出現有利于對類對象屬性的操作,減少了代碼的數量。下面用一個小例子來印證一下。

     我有一個javabean(關于javabean後面會介紹)類introspector,裡面有一個私有的x屬性,現在要得到這個x屬性的值。如果我們用反射來做的話,首先你要将x字元轉為大寫的x,然後用字元串拼接成getx,然後你要用反射得到introspector類的class,再得到類的所有公有方法,循環比較方法找出getx方法的method對象,然後用method對象的invoke方法得到x屬性的值。這樣做還是比較麻煩的。如果用内省來做就會比較簡單了,方法如下:

    introspector is1 = new introspector();

    //propertyname:屬性名,is1.getclass():包含屬性名對象的class(與反射相關)propertydescriptor不明白的可以看jdk幫助文檔

    propertydescriptor pd = new propertydescriptor(propertyname,is1.getclass());

    method methodgetx = pd.getreadmethod();

    object getval1 = methodgetx.invoke(is1);//此時的getval1就是屬性x的值

    //也可以設定屬性的值

    method methodsetx = pd.getwritemethod();

    methodsetx.invoke(is1,3);

    内省通路javabean有兩種方法:

        一、通過introspector類獲得bean對象的beaninfo,然後通過beaninfo來擷取屬性的描述器( propertydescriptor ),通過這個屬性描述器就可以擷取某個屬性對應的 getter/setter 方法,然後通過反射機制來調用這些方法。(這種方法要麻煩一些)

        二、通過propertydescriptor來操作bean對象。(這種方法要簡單得多)

    接下來要對student 類對象進行操作,student類源碼如下:

public class student {

    private string name;//字段

    public string getxxx(){//讀方法

           return "xx";

    }

    public string setxxx(){//寫方法

    public string getname() {

           return name;

    public void setname(string name) {

           this.name = name;

}

    首先、是第一種方式,源碼如下:

    public void test() throws exception{

           student student = new student();

           //1.通過introspector來擷取bean對象的beaninfo

           beaninfo bif = introspector.getbeaninfo(student.class);

           //2.通過beaninfo來獲得屬性描述器(propertydescriptor)

           propertydescriptor pds[] = bif.getpropertydescriptors();

           //3.通過屬性描述器來獲得對應的get/set方法

           for(propertydescriptor pd:pds){

                  //4.獲得并輸出字段的名字

                  system.out.println(pd.getname());

                  //5.獲得并輸出字段的類型

                  system.out.println(pd.getpropertytype());

                  if(pd.getname().equals("name")){

                         //6.獲得propertydescriptor對象的寫方法

                         method md = pd.getwritemethod();

                         //7.執行寫方法

                         md.invoke(student, "lou_wazor");

                  }

           }

           //8.輸出所指派字段的值

           system.out.println(student.getname());

       }

執行結果為:

class

class java.lang.class

name

class java.lang.string

xxx

lou_wazor

以下是通過第二種方法來操作bean對象,源碼如下:

    public void test01()throws exception{

           student st = new student();

           //1.通過構造器來建立propertydescriptor對象

           propertydescriptor pd = new propertydescriptor("name", student.class);

           //2.通過該對象來獲得寫方法

           method method = pd.getwritemethod();

           //3.執行寫方法

           method.invoke(st, "lou_wazor");

           //4.輸出對象字段的值

           system.out.println(st.getname());

           //5.通過對象獲得讀方法

           method = pd.getreadmethod();

           //6.執行讀方法并定義變量接受其傳回值并強制塑形

           string name = (string) method.invoke(st, null);

           //7.輸出塑形後的值

           system.out.println(name);

lou_wazor 

java中的javabean

    一、javabean是什麼?

            javabean 是一種java語言寫成的可重用元件。為寫成javabean,類必須是具體的和公共的,并且具有無參數的構造器。javabean是一種特殊的java類,主要用于傳遞資料資訊,這種java類中的方法主要用于通路私有的字段,且方法名符合某種命名規則。javabean可分為兩種:一種是有使用者界面(ui,user interface)的javabean;還有一種是沒有使用者界面,主要負責處理事務(如資料運算,操縱資料庫)的javabean。jsp通常通路的是後一種javabean。

/**

 * 一個簡單的javabean

 * @author json

 *

 */

public class javabean {

    /**

     * 不寫構造函數方法預設提供無參的構造函數方法,如果寫了一個有參的構造函數方法,那 就有一個有參的構造函數方法,預設的無參構造函數方法就沒有了----這是類的構

     *  造方法的小知識與javabean沒有什麼關系的

     */

//    public javabean(){

//        

//    }

    //私有屬性

    private int x;

    private string y;

     * 得到屬性值

     * @return

    public int getx() {

        return x;

    }

     * 設定屬性值

     * @param x

    public void setx(int x) {

        this.x = x;

    public string gety() {

        return y;

    public void sety(string y) {

        this.y = y;

    二、用javabean的地方

            如果要在兩個子產品之間傳遞多個資訊,可以将這些資訊封裝到一個javabean中,這種javabean的執行個體對象通常稱為值對象(value object, vo),這些資訊在類中用私有  字段來存儲。javabean的屬性是根據其中的setter和getter方法來确定的,而不是根據其中的成員變量.如果方法名為setid,中文意思就是設定id,至于你把它存到哪個變量上,不用考慮。如果方法名為getid,中文意思就是得到id,至于你從哪個變量上取,不用考慮。去掉set字首,剩餘部分就是屬性名,如果屬性的第二個字母是小寫的,那首字母小寫,屬性的第二個字母是大寫的,首字母大寫,大寫是為了好看。

    三、使用javabean要注意的地方

            1.不要試圖在javabean傳回的html中放置任何字型尺寸。------并不是所有的浏覽器都相同。很多浏覽器無法處理完整的字型尺寸。

            3.不要提供任何的選擇。-----------如果使用者使用不同的系統浏覽頁面,可以提供一種可以替換的方法。(關于這點我是不了解的)

   四、javabean的特點

           1. 可以實作代碼的重複利用

           2. 易編寫、易維護、易使用

           3. 可以在任何安裝了java運作環境的平台上的使用,而不需要重新編譯。

   五、javabean遵守的規則

           編寫javabean就是編寫一個java的類,是以你隻要會寫類就能編寫一個bean,這個類建立的一個對象稱做一個bean。為了能讓使用這個bean的應用程式建構工具(比如jsp引擎)知道這個bean的屬性和方法,隻需在類的方法命名上遵守以下規則:

                  getxxx(),用來擷取屬性xxx。

                  setxxx(),用來修改屬性xxx.。

           2. 對于boolean類型的成員變量,即布爾邏輯類型的屬性,允許使用"is"代替上面的"get"和"set"。

           3. 類中通路屬性的方法都必須是public的,一般屬性是private的。

           4. 類中如果有構造方法,那麼這個構造方法也是public的并且是無參數的。

      關于javabean的更多詳細可以去這裡看http://baike.baidu.com/link?url=ufk07rhyopk7w34el9wnqca-uw1gtlpg1ledwwuosdxhxrpafgh-wiivwkfpiqfv