JavaBean
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。
这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。
可以这么说一个类中含有set与get方法,都可以称作JavaBean类。
一般来说通过get方法与set方法可以获取和操作JavaBean类中的属性,但是在框架设计中,事先并不知道get和set哪一个成员属性。需要通过反射来完成。
而通过反射获取set和get方法相对麻烦,于是SUN公司提供了对JavaBean类进行操作的一些API————内省
内省
假定有一个Point类,成员变量x,y都有get和set方法。又假定事先不知道操作哪个变量以及对象,操作变量和对象的名称是通过参数传递进来的。
如何通过内省的方式对Point类的对象的成员变量进行读写操作?
简单的内省操作——建议使用
public class PropertyDescriptorDemo {
public static void main(String[] args) throws Exception{
//假定下面两个数据是通过参数传递进来的
Point pt1=new Point(2,3);
String PropertyName="x";
//通过PropertyDescriptor类导出一个属性
PropertyDescriptor pd1=new PropertyDescriptor(PropertyName, pt1.getClass());
//通过PropertyDescriptor的属性方法获取get和set方法
Method readMethod=pd1.getReadMethod();
System.out.println(readMethod.invoke(pt1));
Method writeMethod=pd1.getWriteMethod();
writeMethod.invoke(pt1, 100);
System.out.println(readMethod.invoke(pt1));
}
}
复杂的内省操作
public class IntrospectorDemo {
public static void main(String[] args)throws Exception {
Point pt=new Point(2,4);
String PropertyName ="x";
//通过Introspector的方法获得BeanInfo
BeanInfo beanInfo=Introspector.getBeanInfo(pt.getClass());
//只有得到BeanInfo的所有属性,没有特定的某属性,需要遍历
PropertyDescriptor[] pds= beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(pd.getName().equals(PropertyName)){
Method readMethod= pd.getReadMethod();
Object reVal=readMethod.invoke(pt);
System.out.println(reVal);
}
}
}
}
BeanUtils工具包
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils
注意:BeanUtils包依赖于logging包,所以两个包都有导入。
BeanUtils类的方法非常简单:
static String | getProperty(Object bean, String name) |
static void | setProperty(Object bean, String name, Object value) |
注意:
1-BeanUtils工具类在对对象的属性进行操作的时候,会自动进行类型转换。例如tPoint类中的x属性为int类型,
但是设置属性值的时候传入的参数却可以是String类型,返回的也是String类。这是因为内部发生了自动类型转换。这是为了以后开发方便起见。
2-BeanUtils工具类可以对属性进行级联操作,例如Point类还有 变量Private Date Birthday ,而Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作:
2-BeanUtils工具类可以对属性进行级联操作,例如Point类还有 变量Private Date Birthday ,而Date(java.util.Date)类中有setTime方法,那么也就相当于Date类型对象有一个time属性,BeanUtils就可以对其进行操作:
BeanUtils. setProperty(pt, "birthday.time", "111");
BeanUtils工具包里有很多类,比如
PropertyUtils类,他与BeanUtils类的区别在于不会自动类型转换,即Point的x是int类型的那么不会转成String类型