--内省和JavaBean--java学习日记13(高新技术)

 

          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
       }
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值