黑马程序员_张孝祥_Java基础加强_JavaBean、内省

来源:互联网 发布:行知实验幼儿园 编辑:程序博客网 时间:2024/05/01 10:24

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


IntroSpector --> JavaBean --> 特殊的Java类


什么是JavaBean:

JavaBean是一种特殊的Java类,它主要用于传递数据信息,此类中的方法按照某种规则命名。这种用于传递信息的对象通常被称为值对象(Value Object, VO),这些信息在类中用私有字段来存储,并通过set和get方法来进行访问。

         private int x;

         int getAge(){...}

         void setAge(int age){...}


把Person作为一个JavaBean开看,可以视其为其拥有一个Age属性,而具体这个属性是如何存储或得来的,我们并不知道,也不需要去关注。

 

即对于JavaBean,外部组件通过其get/set方法来推断其所拥有的属性,即截取getXxx和setXxx中Xxx部分并把第一个字母改为小写,来作为其属性名。(如果第二个字母为小写,则把最后一个字母变为小写)因此对于JavaBean来说,其get和set方法后的名称应该尽量与其属性名完全一致。例如:

getAge --> age

getCPU ---> CPU

getname --> name

 

Person类:

class Person{private int x;public int getAge(){return x;}public void setAge(int age){this.x = age;}}


使用内省操作JavaBean:

一个符合JavaBean特点的类依然可以当做普通类一样进行使用,但把其当做JavaBean来处理可以获得一些额外的便利:

1.      Java EE开发中,经常要用到JavaBean,很多环境下都要求按照JavaBean来操作。

2.      JDK中提供了对JavaBean进行操作的一些API,这套API称之为内省。使用内省可以使得对JavaBean的操作更加便利。

 

使用内省方法获得JavaBean对象属性值

使用内省,需要使用到java.beans软件包。其中的PropertyDescriptor类提供了根据get/set方法操作属性的功能。即getReadMethod() / getWriteMethod(),他们返回get/set方法的Method对象。使用getName()方法可以获取对应的属性名。

Person person = new Person(18); //PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。PropertyDescriptor pd = newPropertyDescriptor("age", person.getClass());Method methodGetAge = pd.getReadMethod();Object retVal = methodGetAge.invoke(person); Method methodSetAge = pd.getWriteMethod();methodSetAge.invoke(person, 28); // 28 Auto-Boxing

 

使用内省的另一种方法:

使用java.beans.Introspector类,这是一个工具类,里面包含的都是static方法,没有构造器。

其中的getBeanInfo(person.getClass())方法可以获得一个对此JavaBean进行描述的BeanInfo类。 BeanInfo对象的getPropertyDescriptors()方法可以返回此JavaBean的所有属性的PropertyDescriptor对象。这种方式相比第一种复杂一些,但是第一种只适用于已知此javabean中具有的属性并希望对其操作的情况,而这种复杂的方法可以在未知JavaBean信息的情况下,动态获得其所有的信息,并对其进行操作。

 

//使用Introspector工具类来获取BeanInfo对象,然后获取所有的属性和方法描述。

BeanInfo info = Introspector.getBeanInfo(person.getClass());PropertyDescriptor[] pds = info.getPropertyDescriptors();for(PropertyDescriptor pd : pds){if(pd.getName().equals(“age”)){                   sop(pd.getReadMethod().invoke(person));                   break;}}


使用Beanutils操作JavaBean

 

Beanutils是apache开发的一套开源工具包,用于进一步简化对JavaBean的操作。

通过使用beanutils这个工具包,我们可以象访问Map一样来访问javabean。所以,beanutils工具包是javabean与map之间的一座桥。这个工具包就是为了struts而生而存在的。

要使用beanutils工具包,需要去网上下载对应的工具包commons-beanutils-current,解压后里面包含一些用户文档,还有三个版本的jar包,一个完全的,一个部分的,一个精巧的。

需要把需要的jar包添加进eclipse工程下。

注意:要使用beanutils包,还需要再添加一个apache公司的另一个日志工具包,commons-logging。

 

使用BeanUils工具类就可以完成对属性的get/set操作。

BeanUtils.getProperty(person, "age");

BeanUtils.setProperty(person, "age","38");

 

注意:setget的值都是字符串。这是为了方便实际Web应用。

 

级联set/get

BeanUtils.setProperty(javaBean, "属性名.属性名","value");

即设置属性的属性。

属性名要赋初值,不然会报无效的属性异常。

 

使用copyProperties(目标对象,源对象)来将后一个对象的属性拷贝到前一个对象中

使用describe(目标对象)可以将一个javabean转换为一个map。

使用populate(javaBean,Map)将一个map的值填充到javabean中。

 

可以直接使用BeanUtils的方法操作map:

Map map = {name : "zxx", age :18}; //java 7 新特性

BeanUtils.setProperty(map,"name", "lhm");

 

PropertyUtils.setProperty(javaBean, "属性名", value);

valueType value =PropertyUtils.getProperty(javaBean, "属性");

 

注意PropertyUtils类操作属性时,set和get都是使用的属性的实际类型,而没有转换为字符串