1.定义PropertyDescriptor 类的对象pd,new的时候传入属性名字,Class
2.pd调用getReadMethod.返回值是Method类型
3.Method调用invoke方法执行
1.Introspector类直接调用方法getBeanInfo得到一个BeanInfo 类的对象bif
getBeanInfo方法参数传入p2.class
2.BeanInfo的对象bif调用getPropertyDescriptors方法得到p2的所有属性组成的数组PropertyDescriptor[] pds
3.遍历这个数组,每个数组值调用getName()方法得到每个属性的名字,如果和指定的名字相同,就Method method=propertyDescriptor.getReadMethod();然后执行这个方法
1. commons-beanutils.jar == commons-beanutils-bean-collections.jar + commons-beanutils-core.jar 所以导包只要导入commons-beanutils.jar就行了。
2. 在工程中,新建一个文件夹,名字叫lib,在lib里存入commons-beanutils.jar,然后,右键点击文件commons-beanutils.jar,选择Build Path------>Add to Build Path
3. 如果这个时候运行,会报错。java.lang.NoclassDefFoundError: org/apache/commons/logging/LogFactory 。由于commons-beanutils.jar运行,需要用到另一个jar包,我们没有导入,所以会报错。 导入org/apache/commons/logging 包, commons-logging-1.1.jar 也放到lib文件夹中,操作步骤和2相同。
4. 这个时候我们可以用BeanUtils工具包了。
1.简单操作
BeanUtils.getProperty(p1,”name”);//p1是Person类的对象,name是属性
BeanUtils.setProperty(p1,”age”,”20”); //设置p1对象的age属性的值是20.
这里要注意,传入的参数,只能是字符串,BeanUtils工具包会把这个字符串转成程序需要的类型。
2.级联操作
BeanUtils包支持对属性的级联操作。例如我们有一个类,这个类中有一个私有属性,类型的Date
通过查API,我们发现Date类对象,也有一个setTime方法,public void setTime (long time)所以,也相当于javabean,我们可以认为Date类有一个属性叫time
下面我们来对birthday属性进行级联操作。
BeanUtils.setProperty(p1,”birthday.time”,”12345”);
运行后,会有报错: java.lang.IllegelArgumentExcetion: No bean specified (没有指定bean)
原因是我们的birthday没有赋初值。 修改代码为private Date birthday=new Date();
BeanUtils.getProperty(p1,”birthday.time”);
2.BeanUtils包其他方法
static void copyProperties(java.lang.Object dest, java.lang.Object orig );
//把一个对象的属性拷贝到另一个对象的属性上
static java.util.Map describe(java.lang.Object bean )
//把一个javabean转换成Map集合,这个方法参数是一个对象。比如传入p (一个Person类对象),Map 集合的键是属性名,值是属性值。
static void populate (java.lang.Object bean , java.util.Map.properties)
//把一个Map集合,封装成javabean
3.PropertyUtils
这个类也有set方法。
propertyUtils.setProperty(p,”age”,20); //设置p的age属性是20
这里要注意propertyUtils和BeanUtils的区别,propertyUtils的参数是20,也就是age自己的类型int,而BeanUtils 参数是字符串