開發框架時,經常需要使用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