黑马程序员_内省

------- android培训java培训、期待与您交流! ---------- 

想弄清内省就先要知道JavaBean

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。

为什么要学内省?

开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。

什么是Java对象的属性和属性的读写方法?

内省访问JavaBean属性的两种方式:

通过PropertyDescriptor类操作Bean的属性

通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。

内省—beanutils工具包

Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils,也是开源的。

public void test() throws Exception{

        Student stu=new Student();

        BeanInfo beanInfo=Introspector.getBeanInfo(Student.class);

        PropertyDescriptor pds[]= beanInfo.getPropertyDescriptors();

        for(PropertyDescriptor pd:pds){

            System.out.println(pd.getName());

            System.out.println(pd.getShortDescription());

            System.out.println(pd.getDisplayName());

            if(pd.equals("age")){

                Method md=pd.getWriteMethod();

                md.invoke(stu, 122);

            }

        }

        System.out.println(stu.getAge());

    }

 

    通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor )通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,

    然后通过反射机制来调用这些方法。

    public void test() throws Exception {

        Student st = new Student();

        // 1、通过Introspector类获得Bean对象的 BeanInfo,

        BeanInfo beanInfo= Introspector.getBeanInfo(Student.class);

        // 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )

        PropertyDescriptor pdrs[] = beanInfo.getPropertyDescriptors();

        // 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,

        for (PropertyDescriptor pd : pdrs) {

            System.out.println(pd.getName());

            System.out.println(pd.getShortDescription());

            System.out.println(pd.getDisplayName());

            if (pd.getName().equals("age")) {  //age是什么类型?

                Method md = pd.getWriteMethod();

                md.invoke(st, 12);

            }

            //获取属性的类型                 

            System.out.println(pd.getName()+""+pd.getPropertyType());

        }

         //获取属性age   

        System.out.println(st.getAge());

 

    }

   

    //简便的方法

    public void test1()throws Exception{

        Student st = new Student();

        //通过构造器创建 PropertyDescriptor对象

        PropertyDescriptor pd = new PropertyDescriptor("age",Student.class);

        Method md = pd.getWriteMethod(); //写操作

        md.invoke(st, 120);

        System.out.println(st.getAge());

        md = pd.getReadMethod();

        int value = (Integer)md.invoke(st, null); //读操作

        System.out.println(value);

       

    }

 

来看看更方便的操作吧

    public void test1()throws Exception{

        Student st = new Student();

        BeanUtils.setProperty(st , "age", 120);

        Object  age = BeanUtils.getProperty(p, "age")

        System.out.println(age);

}

掌握了以上的内容,以后碰上框架需要取用数据的时候就可以轻松的驾驭了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值