下載地址: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<String, String> address = new HashMap<String, String>();
private String[] otherInfo;
private ArrayList<String> product;
private ArrayList<String> employee;
private HashMap<String, String> telephone;
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
public HashMap<String, String> getAddress() ...{
return address;
}
public void setAddress(HashMap<String, String> address) ...{
this.address = address;
}
public String[] getOtherInfo() ...{
return otherInfo;
}
public void setOtherInfo(String[] otherInfo) ...{
this.otherInfo = otherInfo;
}
public ArrayList<String> getProduct() ...{
return product;
}
public void setProduct(ArrayList<String> product) ...{
this.product = product;
}
public ArrayList<String> getEmployee() ...{
return employee;
}
public void setEmployee(ArrayList<String> employee) ...{
this.employee = employee;
}
public HashMap<String, String> getTelephone() ...{
return telephone;
}
public void setTelephone(HashMap<String, String> 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<String, String> am = new HashMap<String, String>();
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<String, String> map = new HashMap<String, String>();
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