您的位置:首页 > 职场人生

黑马程序员_内省和JavaBean笔记

2014-07-12 09:37 369 查看
------- android培训java培训、期待与您交流! ----------

JavaBean

JavaBean是一种特殊的符合一种特殊书写方式的Java类。JavaBean的属性可以由get和set方法推断得到。get和set方法的名称书写规范是get+JavaBean的属性名、set+JavaBean的属性名。这个类的成员变量(与JavaBean的属性名不是一回事)起什么名字无所谓,因为成员变量是私有的,外界看不到。

下面的例子里定义了一个Person类,它有一个age属性。这个类就符合JavaBean的书写规范,可以看成是一个JavaBean。

我们可以知道这个类有一个setAge方法和一个getAge方法。由于它是一个JavaBean,所以我们就可以从方法名字中提取出它的属性名。

public class Person {
//成员变量
private int x;
//set方法
public void setAge(int age){
x = age;
}
//get方法
public int getAge(){
return x;
}
}


javaBean的应用:

在开发中,我们经常需要将一个模块中的数据传递到另一个模块中去,我们就把这些传递的数据当成一个JavaBean来处理。这种JavaBean类的实例化对象称为值对象VO(Value Object)。

Introspector内省

下面我们用内省的方式操作JavaBean
首先我们先定义一个JavaBean类
public class Person {
private int x;
private int y;
Person(){}
public Person(int age, int height){
this.x = age;
this.y = height;
}
public int getAge() {
return x;
}
public void setAge(int age) {
this.x = age;
}
public int getHeight() {
return y;
}
public void setHeight(int height) {
this.y = height;
}
}


我们只知道这个类的属性名,存放在一个字符串中,我们要得到它的值,必须要先把它转化为get方法的名字,然后通过方法的反射调用获得它的值。内省用它的一套办法简化了上面这个操作。
下面用内省的方式操作JavaBean。
获取age的值
//创建对象
Person p1 = new Person(24,178);
//对象的属性名存在字符串中
String propertyName = "age";
//把Person作为JavaBean,通过内省的方法操作JavaBean
PropertyDescriptor pd = new PropertyDescriptor(propertyName, p1.getClass());
//得到Person对应属性名的get方法
int retVal = (int)pd.getReadMethod().invoke(p1);
//打印
System.out.println(retVal);
修改height的值
//属性名
String propertyName2 = "height";
//内省的方式操作javaBean
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2, p1.getClass());
//获得对应属性的set方法,反射方式调用
pd2.getWriteMethod().invoke(p1, 180);


另外一种较为复杂的获取值的实现方法:(读取类似)
BeanInfo beanInfo = Introspector.getBeanInfo(p1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName)){
retVal = (Object)pd.getReadMethod().invoke(p1);
break;
}
}
System.out.println(retVal);

BeanUtils工具包

apache为JavaBean的操作提供了BeanUtils工具包,简化操作。
BeanUtils工具包需要到apache官网下载,而且还需要一个logging的工具包。
下面是用BeanUtils对JavaBean进行get和set,注意虽然age的值是int类型,但是我们我们需要传入字符串类型
//set
BeanUtils.setProperty(p1,"age","35");
//get
System.out.println(BeanUtils.getProperty(p1, "age"));
如果一个JavaBean对象的属性又是一个JavaBean对象,我们可以用属性级联的方式对其进行get和set。
假设上面的age是Date()类型的,Date()有一个方法是setTime(),也就是有一个time的属性,那么:

//set
BeanUtils.setProperty(p1,"age.time","35");
//get
System.out.println(BeanUtils.getProperty(p1, "age.time"));


其他:
1. JavaBean和Map之间可以互相转化
2. PropertyUtils与BeanUtils在设置属性上类似,但是PropertyUtils操作的不是字符串,而是属性的原本类型。
------- Windows Phone 7手机开发.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 内省 javabean