黑马程序员技术交流社区

标题: 内省小结 [打印本页]

作者: wumuzhong    时间: 2013-10-1 23:06
标题: 内省小结
IntroSpector->JavaBean ->特殊的java类
-》javabean是一种特殊的类,主要传递数据信息,这还总java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则
-》如果要在两个模块之间传递多个信息,可以将这些信息封装到一个javabean中,这中javabean的实例对象通常称之为值对象(value object,简称vo)这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,javabean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为getId,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余的首字母改成小的
-》setId()的属性名是->id
-》isLast()的属性名是->last
-》setCPU()的属性名是->CPU
-》getUPS()的属性名是->UPS
总之,一个类被当作javabean使用时,javabean是属性是根据方法名推断出来的, 他根本看不到java类内部的成员变量
一个符合javabean特点的类可以当作普通类一样进行使用,当把它当javabean用肯定需要带来一些额外的好处,我们才会了解和应用javabean和应用javabean,好处如下:
-》zai java EE开发中,经常要使用到javabean,很多环境就要求按javabean方式进行操作
  -》jdk中提供了对javabean进行操作的一些api,这套api就称为内省。如果要自己通过getX方法来访问私有的x,有一定的难度,用内省这套api操作javabean比用普通类的方式方便。
内省综合案例
直接new一个PropertyDescriptor对象的方式来让大家了解javabean api的价值,先用一段代码读取javabean的属性 ,然后再用一段代码设置javabean的属性
-》只要调用这个方法,并给这个方法传递了一个对象,属性名和设置值,他就能完成属性修改的功能
-》得到beaninfo最好采用“obj.getClass()”方式,而不要采用“类名.class”的方式,这样程序更通用
采用遍历beanifo的所有属性方式来查找和设置某个RefectPoint对象的x属性。在程序中把一个类当作javabean来看,就是调用Introspector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息
部分方法:
public static void  setProperties(Object pt1,Strign propertyName,Object value) throws Exception{
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1,getClass());
Method methodSetX = pd2.getWriteMethod();
methodSetX.invoke(pt1,value);
}
public static Object getProperty(Object pt1,String propertyName) throws Exception{
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(pt1);
return retVal;
}
使用Introspector修改getProperty方法
public static Object getProperty(Object pt1,String propertyName) throws Exception{
BeanIfnfo beanInfo = Introspetor.getBeanInfo(pt1.getClass());
PropertyDescriptro[] pds = beanInfo.getPropertyDescriptors();
Object retval = null;
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(propertyName)){
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}

Beanutils工具包
BeanUtils.getProperty(pt1,"x").getClass().getName()
BeanUtils.setProperty(pt1,"x","9");
BeanUtils.setProperty(pt1,"birthday.time","111");
BeanUtils是以字符串的形式对javabe进行操作
PropertyUtils.setProperty(pt1,"x",9);
PropertyUtils是属性本身的类型对javabe进行操作





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2