----------- 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");
注意:set和get的值都是字符串。这是为了方便实际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都是使用的属性的实际类型,而没有转换为字符串