java 內省(Introspector)

劍握在手發表於2013-11-26

開發框架時,經常需要使用java物件的屬性來封裝程式的資料,每次都使用反射技術完成此類操作過於麻煩,所以sun公司開發了一套API,專門用於操作java物件的屬性。

當然你也可以用反射來操作JavaBean的屬性,但是,內省專門用來操作JavaBean屬性。這樣看來是不是內省更專業些?它的API位置:java.beans.Introspector。

 

什麼是JavaBean?

  就是一個用來封裝使用者提交過來的資料的類,說白了就是一個描述使用者資料的類。再說白點,就是一個類……

 

什麼是屬性?

  注意欄位(成員變數)和屬性所指不同。一般來說,如果你和我一樣不是高手,我們可以這樣簡單的來識別:一個類中擁有get或者set方法,那麼它的屬性就是get或者set方法的方法名中,“get”或者“set”後邊的部分。任何類都至少有一個屬性,因為所有類都繼承Object類,而Object類中有一個getClass()方法……

 

程式碼示例:

BeanInfo info = Introspector.getBeanInfo(Person.class); //我們也可以從配置檔案中獲取某個class,參看反射相關內容。

這就是將Person這個類檔案的所有資訊封裝成一個類放在info中便於操作。BeanInfo是javaAPI中一個介面,這裡getBeanInfo:

getBeanInfo

public static BeanInfo getBeanInfo(Class<?> beanClass,
                                   int flags)
                            throws IntrospectionException
在 Java Bean 上進行內省,瞭解其所有屬性、公開的方法和事件,並將結果用一些控制標記表示。

如果 Java Bean 的 BeanInfo 類以前已經基於相同的引數被內省,則從 BeanInfo 快取中檢索 BeanInfo 類。

 

PropertyDescriptor[] pds = info.getPropertyDescriptors();//屬性描述器,得到類的所有屬性

for(PropertyDescriptor pd : pds){

  System.out.println(pd.getName());//可以列印其屬性看看

  //如果不需要這個類從父類繼承過來的屬性可以用“BeanInfo info = Introspector.getBeanInfo(Person.class,父類);”來初始化。

}

 

如果只想操作一個類的某一個屬性比如(Person類的age屬性)可以這樣寫:

PropertyDescriptor pd = new PropertyDescriptor("age",Person.class);

Method method = pd.getWriteMethod(); //得到屬性的寫方法,這裡就是拿到setAge方法

method.invoke(指定Person物件,...method方法的引數);

 

method = pd.getReadMethod();//獲取讀方法

System.out.println(method.invoke(指定Person物件,...method方法的引數,沒有就寫null)); 

 

獲取屬性的型別

pd.getPropertyType();

 

更多內容請參閱API

相關文章