现在的位置: 首页 > 综合 > 正文

黑马程序员—java的内省机制

2013年01月15日 ⁄ 综合 ⁄ 共 2598字 ⁄ 字号 评论关闭

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

 内省是 java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。

    例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。

    java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包 java.beans 中。

    一般的做法是通过类 Introspector 的 getBeanInfo方法 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

 1javaBean是一种特殊的java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则
    2、如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值的对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,大家觉得这些方法的名称交涉呢么好?JavaBean的属性是根据其中的settergettter方法来访问的,而不是根据其中的成员变量。如果方法名为setld,中文的意思即为设置id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余的部分就是属性名,如果剩余部分的第首字母是小写,则把剩余的部分的首字母改成小的。
    总之,一个类别当做javabean使用时,javabena的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量
    3、一个符合javabean特点的类可以id昂做普通类一样使用,但把它当javaBean用肯定需要带来一些格外的好处,我们才会去了解和应用javabean
        在javaEE开发中,经常要使用到javaBean,很多环境就要求按javaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地
    JDK中提供了对javaBean进行操作的而一些API,着他APi就成内省,如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作javaBean比用普通类的方式更方便
    4、演示用eclipse自动生成 ReflectPoint类的settergetter方法。
    5、直接new一个API的价值,先用一段能带吗读取javaBean的属性,然后再用一段代码设置javabean的属性
    6、演示用eclipse读取属性和设置属性的流水账代码分别抽取成方法
        只要调用这个方法,并给这个方法传递了一个对象,属性名,和设置的值,他就能完成属性修改的功能
        得到BeanInfo最好采用obj.getClass方式,而不采用类名。class的方式,这样程序更通用。
    7、采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的X属性,在程序中把一个类当做JavaBean来看,就是调用了IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当JavaBean看的结果信息

  public void test() throws Exception{
 
            Student student = new Student();
 
            //1.通过Introspector来获取bean对象的beaninfo
 
            BeanInfo bif = Introspector.getBeanInfo(Student.class);
 
            //2.通过beaninfo来获得属性描述器(propertyDescriptor)
 
            PropertyDescriptor pds[] = bif.getPropertyDescriptors();
 
            //3.通过属性描述器来获得对应的get/set方法
 
            for(PropertyDescriptor pd:pds){
 
                   //4.获得并输出字段的名字
 
                   System.out.println(pd.getName());
 
                   //5.获得并输出字段的类型
 
                   System.out.println(pd.getPropertyType());
 
                   if(pd.getName().equals("name")){
 
                          //6.获得PropertyDescriptor对象的写方法
 
                          Method md = pd.getWriteMethod();
 
                          //7.执行写方法

                     md.invoke(student, "Lou_Wazor");
 
                   }
 
            }
 
            //8.输出所赋值字段的值
 
            System.out.println(student.getName());
 
        }

 

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

详细请查看:http://edu.csdn.net/heima 

抱歉!评论已关闭.