标签:
IntroSpector--内部检查,了解更多细节--内省---JavaBean
这些信息学在类中用私有字段来存储,如果读取或者设置这些字段的值,这需要通过一些相应的方法来访问,大家觉得这些方法的名字叫什么好呢?
JavaBean的属性石根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,值域你把它存在哪个
变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个
字母是小写的,则把剩余部分的首字母改成小的。
总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。
好处如下:
用内省这套api操作JavaBean比用普通类的方式更方便。
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,则需要通过反射手动一步一步做,步骤为: 01."x"-->02."X"-->03."getX"-->04.MethodGetX--> //读 PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass()); Method methodGetX=pd.getReadMethod();//使用JavaBean API 至此,已经完成了 01、02、03、04,显然方便很多 Object retVal=methodGetX.invoke(rf1); System.out.println(retVal); //写 Object value=6; PropertyDescriptor pd2=new PropertyDescriptor(propertyName, rf1.getClass()); Method methodSetX=pd.getWriteMethod();//使用JavaBean API 至此,已经完成了 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 { //①现在的方式--简捷,好!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; }
标签:
原文地址:http://www.cnblogs.com/qq-757617012/p/4256232.html