黑马程序员---java高新技术之JavaBean

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

JavaBean:

总结:

在一个Person类中,我们可以把它当作一个普通类来操作,比如该类对象调用getAge方法可以得到该对象私有成员属性age的值。但我们仔细看一下该类,你会发现有一种规律,比如:setAge(中文意思是设置年龄)、setName(中文意思是设置名字),没错,这种规律符合setter,getter命名规范,这时我们就可以把这种类称为javaBean类,由这种规范推算出来的成员属性称之为javaBean属性,至于java类内部的成员属性是怎样的我们根本不用去管,也管不了,因为那些都是私有的成员变量。当一个类一旦成为javaBean类时,我们就可以用一些特殊的方式去操作它,比如内省。

示例代码:

calss Person{

       privateint age;

       privateString name;

       publicvoid setAge(int age){

       this.age=age;

}

public intgetAge(){

       return this.age;

}

public voidsetName(int name){

       this. name = name;

}

public intgetName(){

       return this.name;

}

}


 

JavaBean是一种特殊的java类,主要用于传递数据的信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规范。

如果要在两个模块之间传递多个信息,可以将数据信息封装到一个javabean中,这种javabean的实例对象通常称为值对象。 (Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或者设置这些字段的值,则需要通过一些相应的方法来访问,那么这些方法的名称叫什么好呢?javabean的属性是根据其中的setter  getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id ,至于你把它存到哪个变量上,用管吗?如果方法名为getId,中文意思为获取id,至于你从哪个变量上取,用管吗?去掉set前缀,剩余部分就是属性名,如果剩余的第二个字母是小写,则把剩余部分的首字母改成小的。

    setId的属性名->id

    isLast()的属性名->last

    setCPU的属性名是?->CPU

   

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

 

一个符合javaBean特点的类可以当作普通类一样来使用,但把它当作javaBean用肯定需要带来一些额外的好处,我们才会去了解和应用javaBean。好处如下:

       1,在javaEE开发中,经常要使用到javaBean。很多环境就要求按javaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

       2,Jdk中提供了对javaBean进行操作的一些Api,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作javaBean比用普通类的方式更方便。

      

 

用内省操作javaBean:

定义一个类,把它当作javaBean来操作。:

calss Reflectpoint{

       privateint x; //私有成员属性

       privateint y; //私有成员属性

 

Reflectpoint(intx,int y){//带参构造函数

       this.x=x;

       this.y=y;

}

 

//setter,getter方法。

       publicvoid setX(int x){//设置x的值

       this.x=x;

}

public intgetX(){//获取x的值

       return this.X

}

public voidsetY(int y){//设置y值

       this. y= y

}

public intgetY(){//获取y值

       return this.Y;

}

}

 

public classIntroSpectorTest 

{

public staticvoid main(String[] args) throws Exception {

                     ReflectPointpt1 = new ReflectPoint(3,5);

                     StringpropertyName = "x";//定义一个我们认为可能是javaBean的属性x(由公有方法可以得出),

                     //"x"-->"X"-->"getX"-->MethodGetX-->

PropertyDescriptorpd = new PropertyDescriptor(propertyName,pt1.getClass());//创建一个指定类的javaBean属性对象。

                     MethodmethodGetX = pd.getReadMethod();//获取属性对应的getX方法

Object retVal=methodGetX.invoke(pt1); //执行该方法,用指定的对象去调用该方法,相当于pt1.getX(),              

System.out.println(retVal);//创建pt1对象时传入的x值为3,因此打印3

PropertyDescriptorpd2 = new PropertyDescriptor(propertyName,pt1.getClass());

                     MethodmethodSetX = pd2.getWriteMethod(); //获取setX方法

                     methodSetX.invoke(pt1,7);执行setX方法,相当于pt1.setX(7);

                  System.out.println(pt1.getX);//输出7,设置成功。

}

 

用eclipse将上面的代码读取属性和设置属性的流水账代码分别抽取成方法:

       只要调用这个方法,并给这个方法传递一个对象。属性和设置值,它就能完成属性修改的功能。

Object value =7;

private staticvoid setProperties(Object pt1, String propertyName,

                     Object value) throwsIntrospectionException,

                     IllegalAccessException,InvocationTargetException {

              PropertyDescriptor pd2 = newPropertyDescriptor(propertyName,pt1.getClass());

              Method methodSetX =pd2.getWriteMethod();

              methodSetX.invoke(pt1,value);

       }

 

       private static Object getProperty(Objectpt1, String propertyName)

                     throwsIntrospectionException, IllegalAccessException,

                     InvocationTargetException {

              PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass());

              Method methodGetX =pd.getReadMethod();

              Object retVal =methodGetX.invoke(pt1);}


对JavaBean的复杂内省操作.

采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对 象的X属性。在程序中把一个类当作javabean来看,就是调用IntroSpector.getBeanInfo方法,得到一个BeanInfo对 象,这个对象封装了把这个类当作javabean看的结果信息。

public classIntroSpectorTest 

{

public staticvoid main(String[] args) throws Exception

       {

              ReflectPoint pt1 = newReflectPoint(3,5);

             

              String propertyName ="x";//定义了一个我们认为可能是javaBean的属性x(由公有方法得出)

          BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());//把指定的类当作一个javaBean处理,创建BeanInfo对象封装了把这个类当作javaBean来看的结果信息。

 

              PropertyDescriptor[] pds =beanInfo.getPropertyDescriptors();//得到全部属性返回一个数组。其中一组为[name=x;propertyType=int; readMethod=public int Reflectpoint.getX(); writeMethod=publicvoid Reflectpoint.setX(int)]

表示javabean成员属性x,它的set方法为setX(int),get方法为getX()

              Object retVal = null;

              for(PropertyDescriptor pd : pds)//遍历该数组,

                 {  

                     if(pd.getName().equals(propertyName))

                     {      //如果定义的propertyName与遍历到的javaBean属性相同,获取它的get方法。

                            Method methodGetX =pd.getReadMethod();//获取该javaBean属性的get方法

                            retVal = methodGetX.invoke(pt1);//最后执行get方法 获取属性的值。

                            break;

                     }

              }

       }

}


 

 

使用BeanUtils工具包操作JavaBean

工具包:commoms-beanutils.jar,是第三方工具包

public class ReflectPoint {

       privateDate birthday = new Date();//创建Data对象,Data类可以当作javaBean类,Data中有setTime方法。

      

       privateint x;//私有成员变量

       publicint y;//私有成员变量

      

       publicReflectPoint(int x, int y) {//带参构造函数

              super();

              this.x= x;

              this.y= y;

       }

      

//setter,getter方法

       publicint getX() {

              returnx;

       }

       publicvoid setX(int x) {

              this.x= x;

       }

       publicint getY() {

              returny;

       }

       publicvoid setY(int y) {

              this.y= y;

       }

       publicDate getBirthday() {

              returnbirthday;

       }

       publicvoid setBirthday(Date birthday) {

              this.birthday= birthday;

       }

}

 

public classIntroSpectorTest 

{

public static void main(String[] args) throwsException

       {

                     ReflectPointpt1 = new ReflectPoint(3,5);//创建javaBean类对象

System.out.println(BeanUtils.getProperty(pt1,"x")); //获取pt1对象javaBean属性x的值,BeanUtils是以字符串的形式操作javaBean的。打印3.

System.out.println(BeanUtils.getProperty(pt1,"x").getClass().getName());//打印java.lang.String,”x”是字符串类型

                     BeanUtils.setProperty(pt1,"x", "9");//将pt1对象的x值设置为9.

                     System.out.println(pt1.getX());//打印9

                     /*

java7的新特性

//map集合可以和javaBean相互转换,BeanUtils提供了转换的方式,map集合中的键相当于javaBean中的属性。因此BeanUtils可以操作map集合

//Map map = {name:"zxx",age:18};// java7的新特性,以键值对的形式直接加进map集合中。即name键的值为”zxx”,age键的值为18.

BeanUtils.setProperty(map, "name", "lhm");// BeanUtils设置map集合name键的值为”lhm”

*/

                     BeanUtils.setProperty(pt1,"birthday.time", "111");// birthday为javaBean类ReflectPoint类中的javaBean属性,对应的方法为getBirthday。把Data作为javaBean类,即time为Data类中的javaBean属性,对应的方法为setTime方法,相当于pt1.getBirthday().setTime(111)

                     System.out.println(BeanUtils.getProperty(pt1,"birthday.time")); 打印111

                     PropertyUtils.setProperty(pt1,"x", 9);// PropertyUtils是以属性本身的类型来操作javaBean

                     System.out.println(PropertyUtils.getProperty(pt1,"x").getClass().getName());//Integer

        }

}                                        


                                                                            

 


你可能感兴趣的:(黑马程序员---java高新技术之JavaBean)