下载地址:http://commons.apache.org/beanutils/
例子如下:
新建Bean:
package demo.bean;import java.util.ArrayList;import java.util.HashMap;public class Company ...{ private String name; private HashMap address = new HashMap(); private String[] otherInfo; private ArrayList product; private ArrayList employee; private HashMap telephone; public String getName() ...{ return name; } public void setName(String name) ...{ this.name = name; } public HashMap getAddress() ...{ return address; } public void setAddress(HashMap address) ...{ this.address = address; } public String[] getOtherInfo() ...{ return otherInfo; } public void setOtherInfo(String[] otherInfo) ...{ this.otherInfo = otherInfo; } public ArrayList getProduct() ...{ return product; } public void setProduct(ArrayList product) ...{ this.product = product; } public ArrayList getEmployee() ...{ return employee; } public void setEmployee(ArrayList employee) ...{ this.employee = employee; } public HashMap getTelephone() ...{ return telephone; } public void setTelephone(HashMap telephone) ...{ this.telephone = telephone; }}
A.BeanUtils可以直接get和set一个属性的值。
package demo;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;import org.apache.commons.beanutils.BeanUtils;import demo.bean.Company;public class BeanUtilsDemo ...{ public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException ...{ Company c = new Company(); c.setName("Lucy"); System.out.println(BeanUtils.getProperty(c, "name")); HashMap am = new HashMap(); am.put("1","234-222-1222211"); am.put("2","021-086-1232323"); BeanUtils.setProperty(c,"telephone",am); System.out.println(c.getTelephone().get("1")); }}
B.copyProperty方法可以直接进行Bean之间的clone。
package demo;import java.lang.reflect.InvocationTargetException;import org.apache.commons.beanutils.BeanUtils;import demo.bean.Company;public class BeanUtilsDemo ...{ public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException ...{ Company c = new Company(); c.setName("Lucy"); Company c2 = new Company(); BeanUtils.copyProperties(c2, c); System.out.println(BeanUtils.getProperty(c2, "name")); }}
注:但是这种copy都是浅拷贝,复制后的2个Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况。
C.populate方法用于将一个map的值填充到一个bean中。
package demo;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;import org.apache.commons.beanutils.BeanUtils;import demo.bean.Company;public class BeanUtilsDemo ...{ public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException ...{ HashMap map = new HashMap(); map.put("name", "Lucy"); Company c = new Company(); BeanUtils.populate(c, map); System.out.println(c.getName()); }}
D.LazyDynaBean,实现一个动态的Bean,可以直接往里面加入属性,作为一个JavaBean一样使用,也可以用上面的BeanUtils或get/set方法进行操作,而不用事先定义一个标准的JavaBean类
package demo;import java.lang.reflect.InvocationTargetException;import java.util.Map;import org.apache.commons.beanutils.LazyDynaMap;public class BeanUtilsDemo ...{ public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException ...{ LazyDynaMap dynaBean1 = new LazyDynaMap(); dynaBean1.set("foo", "bar"); dynaBean1.set("customer", "title", "Mr"); dynaBean1.set("address", 0, "address1"); System.out.println(dynaBean1.get("address", 0)); Map myMap = dynaBean1.getMap(); System.out.println(myMap.toString()); }}
注:对于这个类还有两个重要的Field要注意:returnnull——指定在get方法使用了一个没有定义过的property时,DynaBean的行为//取的字段的信息
dynaBean1.setReturnNull(true);//设为ture。若Bean中没有此字段,返回null
//默认为false。若Bean中没有此字段,自动增加一个:)
System.out.println(dynaBean1.get(“aaa”));//此时返回null
Restricted——指定是否允许改变这个bean的property。
//MutableDynaClass.setRestricted设为true后,字段不可再增删和修改.
//默认为false,允许增删和修改
dynaBean1.setRestricted(true);
dynaBean1.set(“test”,”error”);//这里会出错!
过设置这两个属性,可以防止意外修改DynaBean的property。在设计架构时,你可以在后台从数据表或xml文件自动产生DynaBean,在传到控制层和表示层之前设置上述属性使其Bean结构不允许修改,如此就不可能无意中修改Bean包含的属性。
E.BeanUtils和PropertyUtils
这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!
当然,若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。
由于不做类型转化,用PropertyUtils在速度上会有很大提高!
详细请参阅:http://www.nihaoblog.com/1_5146.html
每个人心中,都会有一个古镇情怀,流水江南,烟笼人家。