android培训、物联云计算培训、 java培训、期待与您交流! ----------
内省
由内省IntroSpector引出JavaBean的讲解
IntroSpector...>JavaBean...>特殊Java的类 主要用于传递数据信息(如模块之间),访问私有字段,方法的名字按照某种特定规则来取;JavaBean实例对象称之为值对象
private int x;public int getAge() {return x;}public void setAge(int age){this.x=age;}
Age...>如果第二字母是小的,则把第一个字母变小的...>age
gettime...>time;getTime...>time;getCPU...>CPU
设置age属性不能说设置x属性
对JavaBean的简单内省操作
ReflectPoint pt1=new ReflectPoint(3,5);
System.out.println(pt1.getX());
String propertyName="x";
//不用JavaBean思想,则"x"...>"X"...>"getX"...>MethodGetX...>x
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);
Object value=7;
PropertyDescriptor pd2= new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX=pd2.getWriteMethod();
methodSetX.invoke(pt1,value);
System.out.println(pt1.getX());
对JavaBean的复杂内省操作
采用遍历BeanInfo的所有属性方式来查找和设置某个对象的属性
在程序中把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo方法
得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息
private static Object getProperty(Object pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
BeanInfo beanInfo=Introspector.getBeanInfo(pt1.getClass());
Object retVal=null;
PropertyDescriptor [] pds=beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(propertyName)){
Method methodgetX=pd.getReadMethod();
retVal=methodgetX.invoke(pt1);
break;
}
}
return retVal;
}
BeanUtils工具包操作JavaBean
登录http://commons.apache.org/beanutils/和http://commons.apache.org/logging/下载
beanutils和map可相互转换
BeanUtils类get属性返回的结果为字符串, set属性值接受任意类型的对象通常是字符串
PropertyUtils类get属性返回的为本属性本来的类型,set属性值接受属性本来的类型
System.out.println(BeanUtils.getProperty(pt1, "x"));
BeanUtils.setProperty(pt1, "x",9);
System.out.println(pt1.getX());
System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());
//支持属性的级联操作
//birthday复合属性,异常private Date birthday=new Date();正常
BeanUtils.setProperty(pt1, "birthday.time",111);
System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
PropertyUtils.setProperty(pt1, "x",9);
System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());