IntroSpector--內(nèi)部檢查,了解更多細(xì)節(jié)--內(nèi)省---JavaBean
一、JavaBean這些信息學(xué)在類(lèi)中用私有字段來(lái)存儲(chǔ),如果讀取或者設(shè)置這些字段的值,這需要通過(guò)一些相應(yīng)的方法來(lái)訪問(wèn),大家覺(jué)得這些方法的名字叫什么好呢?
JavaBean的屬性石根據(jù)其中的setter和getter方法來(lái)確定的,而不是根據(jù)其中的成員變量。如果方法名為setId,中文意思即為設(shè)置id,值域你把它存在哪個(gè)
變量上,用管嗎?如果方法名為getId,中文意思即為獲取id,至于你從哪個(gè)變量上取,用管嗎?去掉set前綴,剩余部分就是屬性名,如果剩余部分的第二個(gè)
字母是小寫(xiě)的,則把剩余部分的首字母改成小的。
總之,一個(gè)類(lèi)被當(dāng)做JavaBean使用時(shí),JavaBean的屬性是根據(jù)方法名推斷出來(lái)的,它根本看不到j(luò)ava類(lèi)內(nèi)部的成員變量。
好處如下:
用內(nèi)省這套api操作JavaBean比用普通類(lèi)的方式更方便。
二、內(nèi)省綜合案例
package com.itcast.day2;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import com.itcast.day1.ReflectPoint;public class IntroSpectorTest { public static void main(String[] args) throws Exception{ ReflectPoint rf1=new ReflectPoint(3,4); String propertyName="x"; //如果不使用JavaBean API,則需要通過(guò)反射手動(dòng)一步一步做,步驟為: 01."x"-->02."X"-->03."getX"-->04.MethodGetX--> //讀 PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass()); Method methodGetX=pd.getReadMethod();//使用JavaBean API 至此,已經(jīng)完成了 01、02、03、04,顯然方便很多 Object retVal=methodGetX.invoke(rf1); System.out.println(retVal); //寫(xiě) Object value=6; PropertyDescriptor pd2=new PropertyDescriptor(propertyName, rf1.getClass()); Method methodSetX=pd.getWriteMethod();//使用JavaBean API 至此,已經(jīng)完成了 01、02、03、04,顯然方便很多 methodSetX.invoke(rf1,value); System.out.println(rf1.getX()); }} //獲得屬性值得兩種方式public static Object getProperty(Object rf1, String propertyName) throws IntrospectionException, IllegalaccessException, InvocationTargetException { //①現(xiàn)在的方式--簡(jiǎn)捷,好!O(∩_∩)O~~ /*PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass()); Method methodGetX=pd.getReadMethod(); Object retVal=methodGetX.invoke(rf1);*/ //②最早的方式--遍歷查找,較麻煩 ̄へ ̄ Object retVal=null; BeanInfo beanInfo=Introspector.getBeanInfo(rf1.getClass()); PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors(); for(PropertyDescriptor pd:pds){ if(pd.getName().equals(propertyName)){ Method methodGetX=pd.getReadMethod(); retVal=methodGetX.invoke(rf1); break; } } return retVal; }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注