黑马程序员_javaBean

来源:互联网 发布:淘宝外卖不能分口袋 编辑:程序博客网 时间:2024/06/04 01:28

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

今天要跟大家分享的是javaBean,javaBean是一种特殊java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果要在两个模块之间传递信息多个,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有的字段来存储,若读取或设置这些字段的值,则需要一些方法来访问。JavaBean属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。而定义javaBean的属性有如下规则:

去掉setter方法中的set,或者是getter方法中的get,剩下的名字在通过判断此名称的第二个字母是不是小写,如果是小写,则把第一个字母也小写则得到javaBean属性的名称,反之,则不然,示例:

gettime----time

setTime----time

getCPU-----CPU

示例代码:

   classPerson {

 

       private int x;

 

    public int getAge() {

        return x;

    }

 

    public void setAge(int age) {

        this.x = age;

    }

      

}

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

一个符合javaBean特点的类可以当做普通类一样使用,但把它当做javaBean方式进行操作会有额外的好处:

1.  javaEE开发中,经常要用到javaBean,很多环境就要求按javaBean方式进行操作。

2.      JDK中提供了对javaBean进行操作的一些API,这套API就称为内省。如果要自己通过getX方法来访问私有变量,有一定的难度。用内省这套API操作javaBean比普通类方式更方便。

   JavaBean API为我们提供了一些类和方法让我们操作JavaBean的属性,其中类PropertyDescriptor和接口BeanInfo比较常见,下面用一段代码演示读取javaBean的属性,然后再用一段代码设置javaBean的属性:

 

import java.beans.*;

import java.lang.reflect.*;

 

public classIntroSpectorTest {

 

    public static void main(String []args)throws Exception{

        ReflectPointpt1=newReflectPoint(3,5);

       

        StringpropertyName="x";

        //假如上面的是给出的题目,要等到一个属性x的值

        //下面是传统方法得到

    /*  MethodmethodGetX=pt1.getClass().getMethod("getX");

        //先是通过类的字节码得到方法的字节码

        System.out.println(methodGetX.invoke(pt1));

        //通过方法的字节码调用pt1方法返回pt1中的值

        MethodmethodSetX=pt1.getClass().getMethod("setX", int.class);

       

        methodSetX.invoke(pt1,7);

        System.out.println(pt1.getX());*/

       

        //下面通过内省的方式得到

        ObjectretVal = getProperty(pt1, propertyName);

        System.out.println(retVal);

       

        Objectvalue=7;

       

        setProperty(pt1,propertyName, value);

        System.out.println(pt1.getX());

    }

 

    private static void setProperty(Object pt1,String propertyName,

            Objectvalue) throwsIntrospectionException,

            IllegalAccessException,InvocationTargetException {

        PropertyDescriptordp2=newPropertyDescriptor(propertyName,pt1.getClass());

        MethodmethodSetX=dp2.getWriteMethod();

        methodSetX.invoke(pt1,value);

    }

 

    private static ObjectgetProperty(Object pt1, String propertyName)//把ReflectPoint改成Object通用类型

            throws IntrospectionException,IllegalAccessException,

            InvocationTargetException{

        /*PropertyDescriptor dp=newPropertyDescriptor(propertyName,pt1.getClass());

        MethodmethodGetX=dp.getReadMethod();

        ObjectretVal=methodGetX.invoke(pt1);*/

        //用IntroSpector.getBeanInfo的方法来完成值的获取

        BeanInfobeanInfo=Introspector.getBeanInfo(pt1.getClass());

        PropertyDescriptor[]dps=beanInfo.getPropertyDescriptors();

        ObjectretVal=null;

        for(PropertyDescriptordp:dps){

            if(dp.getName().equals(propertyName)){

                MethodmethodGetX=dp.getReadMethod();

                retVal=methodGetX.invoke(pt1);

                break;//记得要停止循环

            }

        }

        return retVal;

    }

}

我要说明的是我用了两种方式得到和设置javaBean类的属性值,其中里面也涵盖了一个eclipse的小技巧,重构抽取代码,把零散的代码变成一个独立的方法,还有我在getProperty方法中对比使用了BeanInfo的方法来获得属性值,其实两者的本质是相同,只不过BeanInfo的方法使用起来稍显麻烦而已。

对于javaBean的使用绝不仅仅于此,还有前辈们为我们提供的相关的javaBean的工具包,譬如Beanutils,等,极大的方便了我们在软件开发。

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

原创粉丝点击