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