zoukankan      html  css  js  c++  java
  • 由内省引出JavaBean的讲解

    IntroSpector--内部检查,了解更多细节--内省---JavaBean

    一、JavaBean

    • JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问私有的字段,且方法名符合某种命名规则。
    • 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object ,简称VO)。

    这些信息学在类中用私有字段来存储,如果读取或者设置这些字段的值,这需要通过一些相应的方法来访问,大家觉得这些方法的名字叫什么好呢?

    JavaBean的属性石根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,值域你把它存在哪个

    变量上,用管吗?如果方法名为getId,中文意思即为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个

    字母是小写的,则把剩余部分的首字母改成小的。

      • setId()的属性名—>id
      • isLast()的属性名—>last
      • setCPU()的属性名—>CPU
      • getUPS()的属性名—>UPS

    总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

    • 一个符合JavaBean特点的类可以当做一个普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和应用JavaBean!

    好处如下:

      • 在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,哪里就没有挑选的余地!
      • JDK中提供了对JavaBean进行操作的一些API,这套API就成为内省。得到如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?

    用内省这套api操作JavaBean比用普通类的方式更方便。

     

     

    二、内省综合案例

    • 演示用eclipse自动生成ReflectPoint的setter和getter方法。
    • 直接new一个PropertyDescriptor对象的方式来让大家了解JavaBean API的价值,先用一段代码读取JavaBean的属性,然后在用一段代码设置JavaBean的属性。
    package com.itcast.day2;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    
    import com.itcast.day1.ReflectPoint;
    public class IntroSpectorTest {
    
        public static void main(String[] args) throws Exception{
            
            ReflectPoint rf1=new ReflectPoint(3,4);
            
            String propertyName="x";
            
            //如果不使用JavaBean API,则需要通过反射手动一步一步做,步骤为:  01."x"-->02."X"-->03."getX"-->04.MethodGetX-->
            
            //
            PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass());
            Method methodGetX=pd.getReadMethod();//使用JavaBean API 至此,已经完成了 01、02、03、04,显然方便很多
            Object retVal=methodGetX.invoke(rf1);
            System.out.println(retVal);
            
            
            
            //
            Object value=6;
            PropertyDescriptor pd2=new PropertyDescriptor(propertyName, rf1.getClass());
            Method methodSetX=pd.getWriteMethod();//使用JavaBean API 至此,已经完成了 01、02、03、04,显然方便很多
            methodSetX.invoke(rf1,value);
            System.out.println(rf1.getX());
        }
    
    }
    • 演示用eclipse将读取属性和设置属性的流水账代码分别抽取成方法:
      • 只要调用这个方法,并给这个方法传递一个对象、属性名和设置值,它就能完成属性修改的功能。
      • 得到BeanInfo最好采用”obj.getClass()”方式,而不要采用”类名.class”方式,这样程序更通用。

    • 采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的x属性。在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法,得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息
    //获得属性值得两种方式
    public static Object getProperty(Object rf1,
                String propertyName) throws IntrospectionException,
                IllegalAccessException, InvocationTargetException {
            
            //①现在的方式--简捷,好!O(∩_∩)O~~
            /*PropertyDescriptor pd=new PropertyDescriptor(propertyName, rf1.getClass());
            Method methodGetX=pd.getReadMethod();
            Object retVal=methodGetX.invoke(rf1);*/
            
            //②最早的方式--遍历查找,较麻烦 ̄へ ̄
            Object retVal=null;
            BeanInfo beanInfo=Introspector.getBeanInfo(rf1.getClass());
            PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
            for(PropertyDescriptor pd:pds){
                if(pd.getName().equals(propertyName)){
                    Method methodGetX=pd.getReadMethod();
                    retVal=methodGetX.invoke(rf1);
                    break;
                }
            }
            return retVal;
        }
  • 相关阅读:
    C++ Low level performance optimize
    简单find命令的实现
    数据结构学习之栈
    随机数的生成
    数据结构学习(一)
    C复习---动态内存分配
    (转)虚拟文件系统(VFS)浅析
    (转) 中断处理程序&中断服务例程
    Gradle系列教程之依赖管理
    Gradle系列教程之依赖管理
  • 原文地址:https://www.cnblogs.com/qq-757617012/p/4256232.html
Copyright © 2011-2022 走看看