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;
        }
  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/qq-757617012/p/4256232.html
Copyright © 2011-2022 走看看