黑马程序员_java之内省

时间:2023-02-18 11:44:42

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());