内省(introSpector)

来源:互联网 发布:java web j2ee 编辑:程序博客网 时间:2024/06/05 14:14

用于对JavaBean(特殊的Java类:符合一些特殊的规则get/set方法)操作。

当一个普通的类中有getXxx , setXxx方法时,就可以当做一个JavaBean来操作。在JavaBean中并不知道这个类中的成员名称,所以就把去除get , set后的名称当做成员名称:

       如果去除get , set后的名称的第二个字母是小写,则把第一个字母变成小写。如:

       gettime -->  time getTime--> time   getCPU -->CPU

 JDK中提供了JavaBean进行操作的API,这API就称为内省。

       如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object  ,简称VO) 。

内省的JavaBean应用

       PropertyDescriptor  pd = new PropertyDescriptor( 属性名 , 类名 );

       pd.getReadMethod();

       pd.getWriterMethod();

 JavaBean规则

1. 类访问权限为公有
2. 
所有属性为私有
3. 
每个字段对外提供setter方法和getter方法
4. 
具备一个无参的构造方法

例:

    PropertyDescriptor pd = new PropertyDescriptor(propertyName,isd.getClass());//参数1:属性名,参数2:bean类    MethodmethodSetX = pd.getWriteMethod();    methodSetX.invoke(isd,obj);    MethodmethodGetX = pd.getReadMethod();    ObjectretVal = methodGetX.invoke(isd);

可以用Eclipse的方法抽取(Refactor/Extract Method...)自动生成setPropertygetProperty方法。将其封装进去。

把一个类当作JAVABEAN:

       BeanInfo  beanInfo = IntorSpector.getBeanInfo( 对象.getClass() );       PropertyDesriptors[]  pds= beanInfo.getPropertyDescriptors();//可获取类中所有的属性方法。       再用for循环历遍查找需要的方法。              BeanInfo beanInfo = Introspector.getBeanInfo(isd.getClass());        PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();              ObjectretVal = null;        for(PropertyDescriptor pd : pds){                      if(pd.getName().equals(propertyName)){                             MethodmethodGetX = pd.getReadMethod();                retVal= methodGetX.invoke(isd);                break;            }        }              return retVal;

BeanUtils工具包

         Java7的新特性:

       Map  map =  (name : “zxx”,age : 18);       BeanUtils.setProperty(map,“name”,”lhm”);

get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。

       BeanUtils.setProperty(bud,"y", "19");       System.out.println(BeanUtils.getProperty(bud,"y"));

get或者set属性链的值:

       BeanUtils.setProperty(bud,"birthDay.time", "111");       System.out.println(BeanUtils.getProperty(bud,"birthDay.time"));

copyProperty(Object best,Object orig)copy源属性的值至目标属性。

describe(Object dean): 将一个bean转换成map;

       Mapmap = BeanUtils.describe(bud);       BeanUtils.setProperty(map,"y", 22);       System.out.println(map);
PropertyUtils:getset都是属性本来的类型
       PropertyUtils.setProperty(bud,"x", 13);       PropertyUtils.getProperty(bud,"x");










原创粉丝点击