JAVA 內省(introSpector)

用於對JavaBean(特殊的Java類:符合一些特殊的規則get/set方法)操做。 java

當一個普通的類中有getXxx , setXxx方法時,就能夠當作一個JavaBean來操做。在JavaBean中並不知道這個類中的成員名稱,因此就把去除get , set後的名稱當作成員名稱: 工具

       若是去除get , set後的名稱的第二個字母是小寫,則把第一個字母變成小寫。如: spa

       gettime -->  time getTime--> time   getCPU -->CPU code

 JDK中提供了JavaBean進行操做的API,這API就稱爲內省。 對象

       若是要在兩個模塊之間傳遞多個信息,能夠將這些信息封裝到一個JavaBean中,這種JavaBean的實例對象一般稱之爲值對象(Value Object  ,簡稱VO) 。 ip

內省的JavaBean應用 字符串

       PropertyDescriptor  pd = new PropertyDescriptor( 屬性名 , 類名 ); get

       pd.getReadMethod(); it

       pd.getWriterMethod(); for循環

 JavaBean規則

1. 類訪問權限爲公有
2. 
全部屬性爲私有
3. 
每一個字段對外提供setter方法和getter方法
4. 
具有一個無參的構造方法


PropertyDescriptor pd = new PropertyDescriptor(propertyName,isd.getClass());//參數1:屬性名,參數2:bean類

    MethodmethodSetX = pd.getWriteMethod();

    methodSetX.invoke(isd,obj);

    MethodmethodGetX = pd.getReadMethod();

    ObjectretVal = methodGetX.invoke(isd);

能夠用Eclipse的方法抽取(Refactor/Extract Method...)自動生成setPropertygetProperty方法。將其封裝進去。

把一個類看成JAVABEAN:

BeanInfo  beanInfo = IntorSpector.getBeanInfo( 對象.getClass() );

       PropertyDesriptors[]  pds= beanInfo.getPropertyDescriptors();//可獲取類中全部的屬性方法。

       再用for循環歷遍查找須要的方法。

              BeanInfo beanInfo = Introspector.getBeanInfo(isd.getClass());

        PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();      

        ObjectretVal = null;

        for(PropertyDescriptor pd : pds){          

            if(pd.getName().equals(propertyName)){             

                MethodmethodGetX = pd.getReadMethod();

                retVal= methodGetX.invoke(isd);

                break;

            }

        }      

        return retVal;

BeanUtils工具包

         Java7的新特性:

Map  map =  (name : 「zxx」,age : 18);

       BeanUtils.setProperty(map,「name」,」lhm」);
get屬性時返回的結果爲字符串,set屬性時能夠接受任意類型的對象,一般使用字符串。

[java] view plaincopy
BeanUtils.setProperty(bud,"y", "19");  
  
System.out.println(BeanUtils.getProperty(bud,"y"));  

get或者set屬性鏈的值:

[java] view plaincopy
BeanUtils.setProperty(bud,"birthDay.time", "111");  
  
System.out.println(BeanUtils.getProperty(bud,"birthDay.time"));  

copyProperty(Object best,Object orig):copy源屬性的值至目標屬性。
describe(Object dean):
 將一個bean轉換成map;

[java] view plaincopy
Mapmap = BeanUtils.describe(bud);  
  
BeanUtils.setProperty(map,"y", 22);  
  
System.out.println(map);  
PropertyUtils:get和set都是屬性原本的類型
[java] view plaincopy
PropertyUtils.setProperty(bud,"x", 13);  
  
PropertyUtils.getProperty(bud,"x");
相關文章
相關標籤/搜索