// 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("langhua@qq.com");
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("langhua@qq.com");
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 的对象。