// BeanUtils.copyProperties(projectJ, financeVo.getFinancing());
PropertyUtils.copyProperties(projectJ, financeVo.getFinancing());
projectJ.setId(null);
projectJ.setStage(null);
// BeanUtils.copyProperties(projectJ, financeVo.getFinancing());
1、DynaBean和LazyDynaBean
DynaBean dynaBean = new LazyDynaBean();
DynaBean是一個接口類,可以由LazyDynaBean生成一個DynaBean的實例,用於處理符合javaBean規則的bean,相當於一個可以製作出各種形狀棒冰的萬能模型。
DynaBean的內部實現簡介,LazyDynaBean是DynaBean的實現類。其中,最核心的思路是用一個Map保存了javaBean的各個屬性名和屬性值,將屬性名和屬性值分別放在Map型的key和value當中。另外,LazyDynaBean當中還有一個重要的DynaClass類,用於將各個key的屬性名和屬性類型(String型、int型等)保存到DynaProperty當中。
主要方法:
dynaBean.set(String property, String value); //通過指定屬性名,設置屬性值。
dynaBean.get(String property); //通過指定屬性名,獲得屬性值。
2、BeanUtils
BeanUtils.copyProperties(dynaBean, object);
我們用一條簡單的語句,即可將object(任何符合javaBean規則的bean)複製到dynaBean實例中。bean當中的各個屬性和屬性值會自動放入一個Map裏面,屬性名和屬性類型自動放入一個DynaProperty中。
3、DynaProperty[]
DynaProperty[] dynaProperty = dynaBean.getDynaClass().getDynaProperties();
用以上語句,將DynaProperties中的屬性名和屬性類型放入DynaProperty[]數組當中,包括name(屬性名)、type(屬性類型)和contentType。(從實際調試的情況看,數組的排序按找name字母順序排序。)
4、屬性名和屬性值的獲取
//對屬性數組進行循環
for (DynaProperty i : dynaProperty) {
//下面的條件判斷,因爲dynaBean的某個屬性沒有設置值,
//用getName()方法去獲取值的時候,返回的是字符串Object。
if (!dynaBean.get(i.getName()).getClass().getSimpleName().equals("Object")) {
//在此處用i.getName()獲得屬性名,
//再用dynaBean.get(i.getName())獲得對應的屬性值,
//由此組合出我們想要的各種結果。
}
}
beanutils基地: http://commons.apache.org/beanutils/
//1.Commons beanutils要用到的三個包,一個主要包commons-beanutils-1.8.0.jar和兩個依賴包commons-logging-1.1.1.jar和commons-logging-api-1.1.1.jar
public class BeanUtilsExample {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Profile profile = new Profile();
Map<String,String> map = new HashMap<String,String>();
map.put("home", "123");
map.put("tel", "12574");
profile.setPhone(map);
profile.setBrithDate(new Date());
profile.setEmail("[email protected]");
Address[] address = {new Address("pzh","xj"),new Address("km","rmdl")};
profile.setAddress(address);
User user = new User();
user.setId(100);
user.setUsername("username");
user.setPassword("password");
user.setProfile(profile);
//一般類型
prt(BeanUtils.getProperty(user, "id"));
//引用類型的一般類型
prt(BeanUtils.getProperty(user, "profile.brithDate"));
//Map類型
prt(BeanUtils.getProperty(user, "profile.phone(home)"));
//數組和List,Set類型
prt(BeanUtils.getProperty(user, "profile.address[0].city"));
User user2 = new User();
//複製Bean,但如果Bean裏面引用類型的不能複製
BeanUtils.copyProperties(user2, user);
}
public static void prt(Object object){
System.out.println(object);
}
}
//1.Commons beanutils要用到的三個包,一個主要包commons-beanutils-1.8.0.jar和兩個依賴包commons-logging-1.1.1.jar和commons-logging-api-1.1.1.jar
public class BeanUtilsExample {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Profile profile = new Profile();
Map<String,String> map = new HashMap<String,String>();
map.put("home", "123");
map.put("tel", "12574");
profile.setPhone(map);
profile.setBrithDate(new Date());
profile.setEmail("[email protected]");
Address[] address = {new Address("pzh","xj"),new Address("km","rmdl")};
profile.setAddress(address);
User user = new User();
user.setId(100);
user.setUsername("username");
user.setPassword("password");
user.setProfile(profile);
//一般類型
prt(BeanUtils.getProperty(user, "id"));
//引用類型的一般類型
prt(BeanUtils.getProperty(user, "profile.brithDate"));
//Map類型
prt(BeanUtils.getProperty(user, "profile.phone(home)"));
//數組和List,Set類型
prt(BeanUtils.getProperty(user, "profile.address[0].city"));
User user2 = new User();
//複製Bean,但如果Bean裏面引用類型的不能複製
BeanUtils.copyProperties(user2, user);
}
public static void prt(Object object){
System.out.println(object);
}
}
JavaBean
Java代碼
public class Address implements Serializable {
private String city;
private String addr;
public Address(){
}
public Address(String city,String addr){
this.city = city;
this.addr = addr;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
public class Profile implements Serializable {
private Map<String,String> phone;
private Address[] address;
private Date brithDate;
private String email;
public Map<String, String> getPhone() {
return phone;
}
public void setPhone(Map<String, String> phone) {
this.phone = phone;
}
public Address[] getAddress() {
return address;
}
public void setAddress(Address[] address) {
this.address = address;
}
public Date getBrithDate() {
return brithDate;
}
public void setBrithDate(Date brithDate) {
this.brithDate = brithDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
public class User implements Serializable {
private int id;
private String username;
private String password;
private Profile profile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
}
//LazyDynaBeanExample的用法,動態的創建JAVABEAN
public class LazyDynaBeanExample {
public static void main(String[] args) {
LazyDynaBean user = new LazyDynaBean();
LazyDynaBean profile = new LazyDynaBean();
//設置一般屬性
user.set("userId", 123456);
//設置對象
user.set("profile", profile);
//設置對象的數組,List
profile.set("address", 0, "a");
//設置對象的Map
profile.set("tel","key", "value");
}
}
//BeanUitls還封裝了對JDBC連結結果集ResultSet
//ResultSetDynaClass和RowSetDynaClass
http://java.chinaitlab.com/JDBCJDO/39229.html
首先說明,這是我在實際使用中的個人感受,並不是從官網的指南中翻譯或理解的。
總體感覺就是通過使用beanutils這個工具包,我們可以象訪問map一樣來訪問javabean.
BeanUtils這個類,就是允許我們用類似於訪問map的方式來操作實際的業已存在的javabean.
ConvertUtils這個類,感覺象對BeanUtils類的一個支撐,因爲畢竟map中的key-value是弱類型的數據,而javabean中的各個成員變量是強類型的數據,所以使用弱類型的訪問方式訪問強類型數據的過程中勢必會有數據類型轉換的問題,所以ConvertUtils出現了而且存在了.
DynaBean,繼承這一接口的一系列類,允許我們從頭開始構造一個特殊的bean:可以定義metadata的類型,通過map方式訪問.當然,它更能夠被BeanUtils操作.
知道寫本文的時候,我的個人感覺就是這個包就是爲了struts應用的實現而生成的.beanutils這個包的應用範圍:面對多樣化的需求,我們要構造一種數據結構(數據封裝體)及針對這種結構的一系列操作方法,它對於輸入並不關心,數量、類型、組合形式可以任意變化,同樣還向使用此結構的用戶提供統一的操作方法。針對真真正正的javabean的操作的部分,應該是這個工具包爲了兼容已有的應用而出現的;如果以前沒有javabean出現的話,相信beanutils會推薦大家使用map作爲數據傳輸對象。
將javabean轉換爲map,我個人總感覺這不是OO的思想,但是如果正如我前面所說--這個工具包就是爲了struts而生而存在的話,那就可以完全理解了,所以,beanutils工具包是javabean與map之間的一座橋。
另外,當大家使用這個工具包的時候,要明確考慮下應用的環境是否真的需要beanutils工具包,因爲這個beanutils子項目好象現在不再維護了。
下面是apache mail-list 中關於維護的一部分:
On Tue, 2005-07-19 at 19:48 +0200, Dewitte Rémi wrote:
> I wrote this method, can i have your comments for improvements ?
Hi Remi,
Unfortunately, BeanUtils is basically unmaintained. You are unlikely to
get any feedback on suggestions or patches for BeanUtils.
I suggest that you create a bugzilla entry and attach your proposed code
in case beanutils maintenance restarts in the future - but don't depend
on it.
Regards,
Simon
--------------------------------------------------------------------------------------------------------------------------------------
BeanUtils.copyProperties與PropertyUtils.copyProperties用法及區別[轉載]2009年07月07日 星期二 上午 10:05一、簡介:
BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean 通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。
二、用法:
BeanUtils是這個包裏比較常用的一個工具類,這裏只介紹它的copyProperties()方法。該方法定義如下:
public static void copyProperties(java.lang.Object dest,java.lang.Object orig) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
如果你有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts裏的PO對象(持久對象)和對應的ActionForm,例如 Teacher和TeacherForm。我們一般會在Action裏從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐 個賦值:
//得到TeacherFormTeacherForm teacherForm=(TeacherForm)form;//構造Teacher對象Teacher teacher=new Teacher();//賦值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher對象到數據庫HibernateDAO.save(teacher);而使用BeanUtils後,代碼就大大改觀了,如下所示://得到TeacherFormTeacherForm
teacherForm=(TeacherForm)form;//構造Teacher對象Teacher teacher=new Teacher();//賦值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher對象到數據庫HibernateDAO.save(teacher);
如果Teacher和TeacherForm間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理, 需要程序員手動處理。例如 Teacher包含modifyDate(該屬性記錄最後修改日期,不需要用戶在界面中輸入)屬性而TeacherForm無此屬性,那麼在上面代碼的 copyProperties()後還要加上一句:
teacher.setModifyDate(new Date());
怎麼樣,很方便吧!除BeanUtils外還有一個名爲PropertyUtils的工具類,它也提供copyProperties()方法,作用與 BeanUtils的同名方法十分相似,主要的區別在於後者提供類型轉換功能,即發現兩個JavaBean的同名屬性爲不同類型時,在支持的數據類型範圍 內進行轉換,而前者不支持這個功能,但是速度會更快一些。BeanUtils支持的轉換類型如下:
* java.lang.BigDecimal * java.lang.BigInteger * boolean and java.lang.Boolean * byte and java.lang.Byte * char and java.lang.Character * java.lang.Class * double and java.lang.Double * float and java.lang.Float * int and java.lang.Integer * long and java.lang.Long * short and java.lang.Short * java.lang.String * java.sql.Date * java.sql.Time * java.sql.Timestamp
這裏要注意一點,java.util.Date是不被支持的,而它的子類java.sql.Date是被支持的。因此如果對象包含時間類型的屬性,且希望被轉換的時候,一定要使用java.sql.Date類型。否則在轉換時會提示argument mistype異常。
三、優缺點:
Apache Jakarta Commons項目非常有用。我曾在許多不同的項目上或直接或間接地使用各種流行的commons組件。其中的一個強大的組件就是BeanUtils。我 將說明如何使用BeanUtils將local實體bean轉換爲對應的value 對象:
BeanUtils.copyProperties(aValue, aLocal)
上面的代碼從aLocal對象複製屬性到aValue對象。它相當簡單!它不管local(或對應的value)對象有多少個屬性,只管進行復制。我們假 設 local對象有100個屬性。上面的代碼使我們可以無需鍵入至少100行的冗長、容易出錯和反覆的get和set方法調用。這太棒了!太強大了!太有用 了!
現在,還有一個壞消息:使用BeanUtils的成本驚人地昂貴!我做了一個簡單的測試,BeanUtils所花費的時間要超過取數 據、將其複製到對應的 value對象(通過手動調用get和set方法),以及通過串行化將其返回到遠程的客戶機的時間總和。所以要小心使用這種威力!
()
BeanUtils.copyProperties() 用法
一、簡介:
BeanUtils提供對Java反射和自省API的包裝。其主要目的是利用反射機制對JavaBean的屬性進行處理。我們知道,一個JavaBean通常包含了大量的屬性,很多情況下,對JavaBean的處理導致大量get/set代碼堆積,增加了代碼長度和閱讀代碼的難度。
二、用法:
如果你有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts裏的PO對象(持久對象)和對應的ActionForm。例如:一個用戶註冊頁面,有一個User實體類和一個UserActionForm,我們一般會在Action裏從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐個賦值:
Java代碼
// 獲取 ActionForm 表單數據
UserActionForm uForm = (UserActionForm) form;
// 構造一個User對象
User user = new User();
// 逐一賦值
user.setUsername(uForm.getUsername);
user.setPassword(uForm.getPassword);
user.setAge(uForm.getAge);
// 然後調用JDBC、或操作Hibernate 持久化對象User到數據庫
// 獲取 ActionForm 表單數據
UserActionForm uForm = (UserActionForm) form;
// 構造一個User對象
User user = new User();
// 逐一賦值
user.setUsername(uForm.getUsername);
user.setPassword(uForm.getPassword);
user.setAge(uForm.getAge);
// 然後調用JDBC、或操作Hibernate 持久化對象User到數據庫
通過這樣的方法如果表單數據N多、100、1000(誇張點。哈哈)、、、、那我們不是要寫100、、、1000行set、get了。誰都不願意這樣做。
而我們使用 BeanUtils.copyProperties() 方法以後,代碼量大大的減少,而且整體程序看着也簡潔明朗,代碼如下:
Java代碼
// 獲取 ActionForm 表單數據
UserActionForm uForm = (UserActionForm) form;
// 構造一個User對象
User user = new User();
// 賦值
BeanUtils.copyProperties(user, uForm);
// 然後調用JDBC、或操作Hibernate 持久化對象User到數據庫
// 獲取 ActionForm 表單數據
UserActionForm uForm = (UserActionForm) form;
// 構造一個User對象
User user = new User();
// 賦值
BeanUtils.copyProperties(user, uForm);
// 然後調用JDBC、或操作Hibernate 持久化對象User到數據庫很方便是吧。
注:如果User和UserActionForm 間存在名稱不相同的屬性,則BeanUtils不對這些屬性進行處理,需要手動處理。例如:
User類裏面有個createDate 創建時間字段,而UserActionForm裏面無此字段。BeanUtils.copyProperties()不會對此字段做任何處理。必須要自己手動處理。
還有個注意的地方是,貌似UserActionForm裏面不能帶有時間類型的屬性,比如Date,Timestamp、、、我調試的時候就會報錯。可能是我技術問題、呵呵。
第一次寫blog、有說不對的地方希望各位大蝦多多指點。在此謝過了
()
BeanUtils.copyProperties 與 PropertyUtils.copyProperties 都是拷貝對象屬性的方法,BeanUtils 支持類型轉換,而 PropertyUtils 不支持。但是 BeanUtils 不允許對象的屬性值爲 null,PropertyUtils 可以拷貝屬性值 null 的對象。