JavaBean是一个特殊的java类,主要用于传递数据信息,它提供访问和设置私有字段的方法。如果要在两个模块之间传递信息,就将这些信息封装到一个JavaBean中。它的方法的命名符合某种特定的规则 getXxx(),setXxx()..JavaBean的属性是根据其setter和getter方法确定的,而不是根据成员变量。可通过方法名得到属性名:去掉方法名中的get、set,如果剩下的第二个字母是小写,则将首字母改成小写,否则不变,这样就得到了对应的成员变量。
例如:setId() 表示JavaBean中有一个私有字段,名字叫id。setCPU()表示有一个字段名叫CPU等。
一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处:
1-在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。
2-JDk中提供了对JavaBean进行操作的一些API,这套API就称为内省(IntroSpector)。它提供了方便的方法来操作JavaBean。
用普通方法得到JavaBean中的一个属性“x” 的步骤如下:“x”---"X"----"getX"---methodGetX----...这个过程显然很复杂,既然这个方法这么复杂,根据面向对象技术,应该封装一个类来完成这些事。Java提供了一些API专门用来操作就是内省。如何通过内省得到属性x 呢?如下:
public static void main(String[] args) throws Exception{
ReflectPoint rp = new ReflectPoint(4,7);// 定义一个ReflectPoint对象
PropertyDescriptor pd = new PropertyDescriptor("x", ReflectPoint.class);// 获得属性描述符
Method methodGetX = pd.getReadMethod(); // 获得getX()方法
Object realVla = methodGetX.invoke(rp);// 调用rp的getX方法
System.out.println(realVla);// 打印出x的值:4
}
从这个例子也可以看出,有了内省,操作JavaBean变得更简单,不用自己再去写大量代码获得类中的信息。
还有一些其他的工具包如BeanUtils。它也提供了大量的操作JavaBean的方法,并且支持属性的级联操作。
比如,要通过BeanUtils获取一个对象的属性x,可以用下面的语句完成:BeanUtils.getProperty(类对象,"x");
支持级联操作的体现:加入有一个Date类型的属性birthday,可以直接通过setProperty方法获得birthday的time属性进行设置,这样大大减少了代码量,使程序看起来更简洁。(根据Date类的方法setTime()得出birthday有time属性)。
通过内省获得ReflectPoint(类定义见 java学习日记12 )的属性x 的getter和setter方法并修改x 的值:
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3, 5);
String propertyName = "x"; // 获取的成员变量名为x
PropertyDescriptor pd1 = new PropertyDescriptor(propertyName, pt1.getClass());// 获得一个属性描述符
Method readMethod = pd1.getReadMethod();// 获得x的get方法
Object retVal = readMethod.invoke(pt1); // 调用pt1的getX()方法
System. out.println(retVal); // 打印pt1的x 的值
//结果:3
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass());
Method writeMethod = pd2.getWriteMethod();// 获得x的set方法
Object value = 7; // 声明一个对象用来存放要设置的x 的值
writeMethod.invoke(pt1,value); // 调用pt1的getX()方法
System. out.println(pt1.getX()); // 打印pt1的改变后的x 的值
//结果:7
}
}