xscn

博客园 首页 新随笔 联系 订阅 管理

 

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。
也就是说是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

JavaBean有三个特性:
1、javaBean必须是一个public的类
2、JavaBean有一个不带参数的构造函数
3、JavaBean通过 getPropertyName获取属性,通过setPropertyName设置属性

例如类BeanDemo就是一个Javabean类。

一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。能看到的只有public的方法名。可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。

 1 public class BeanDemo {
 2 
 3     private String n;
 4     private int a;
 5 
 6     public BeanDemo() {
 7         super();
 8     }
 9     public String getName() {
10         return n;
11     }
12     public void setName(String name) {
13         this.n = name;
14     }
15     public int getAge() {
16         return a;
17     }
18     public void setAge(int age) {
19         this.a = age;
20     }
21 }

 

反射技术实际上已经能够完全满足我们对javaBean的各种操作了,但是为了方便JDK还是为我们提供了一套操纵JavaBean的API,我们称这套API为内省(Introspector)。

1.通过内省的方式用代码演示读取和设置BeanDemo的属性,适合对于某个特定的属性进行内省操作。

 1 import java.beans.*;
 2 import java.lang.reflect.*;
 3 
 4 public class IntroSpectorDemo1 {
 5     
 6     public static void main(String args[]) throws Exception{
 7         BeanDemo bd = new BeanDemo();
 8         PropertyDescriptor pd=new  PropertyDescriptor("name",bd.getClass());
 9         Method writeMethod=pd.getWriteMethod();
10         writeMethod.invoke(bd,"zhangsan");
11         Method readMethod=pd.getReadMethod();
12         Object retval=readMethod.invoke(bd);
13         System.out.println(retval);
14     
15         }
16 }

java.beans包中
类 PropertyDescriptor描述 Java Bean 通过一对存储器方法导出的一个属性。

PropertyDescriptor(String propertyName, Class<?> beanClass)
通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。

通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。因此如果参数名为 "fred",则假定 writer 方法为 "setFred",reader 方法为 "getFred"(对于 boolean 属性则为 "isFred")。

参数:propertyName - 属性的编程名称。

beanClass - 目标 bean 的 Class 对象。例如 sun.beans.OurButton.class。
Method getReadMethod()
获得应该用于读取属性值的方法。
Method getWriteMethod()
获得应该用于写入属性值的方法。

2.遍历BeanInfo的所有属性方式来查找和设置BeanDemo的属性,适用于批量操纵javaBean中的方法。

 1 import java.beans.*;
 2 import java.lang.reflect.*;
 3 public class IntroSpectorDemo2 {
 4 
 5     public static void main(String args[])throws Exception {
 6         BeanDemo bd = new BeanDemo();        
 7         introSpector(bd);
 8     
 9     }
10     private static void introSpector(Object bd)throws Exception {
11         BeanInfo bi = Introspector.getBeanInfo(bd.getClass());
12         PropertyDescriptor[] pd = bi.getPropertyDescriptors();//
13         
14         for (PropertyDescriptor pds : pd) {
15             String propertName=pds.getName();//获取属性编程名称
16             Method writeMethod=pds.getWriteMethod();
17                         
18             if(propertName.equals("name"))
19                 writeMethod.invoke(bd, "zhangsan");                
20             else if(propertName.equals("age"))
21                 writeMethod.invoke(bd, 20);
22             else 
23                 continue; //因为每个类都从Object类中继承了getClass()方法,添加循环判断条件去除扫描此方法。                        
24                 Method readMethod = pds.getReadMethod();
25                 Object retval = readMethod.invoke(bd);
26                 System.out.println(retval);            
27         }
28     }
29 }

 

在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法, 得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。

static BeanInfo getBeanInfo(Class<?> beanClass)
在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。

 

PropertyDescriptor[] getPropertyDescriptors()
获得 beans PropertyDescriptor

 

 

 

 

 

 

 

posted on 2013-08-23 18:16  xscn  阅读(286)  评论(0编辑  收藏  举报