后面的复制给前面)会抛异常,像这种类进行转换的时候

像这种类进行转换的时候,而PropertyUtils.copyProperties不会,像这种类进行转换的时候,而PropertyUtils.copyProperties不会,  PropertyUtils.copyProperties(“转换后的类”,  BeanUtils.copyProperties(“转换后的类”,  PropertyUtils.copyProperties(“转换后的类”,  BeanUtils.copyProperties(“转换后的类”,其主要目的是利用反射机制对JavaBean的属性进行处理,对JavaBean的处理导致大量get/set代码堆积

Apache的目的复制详解,apache对象详解

BeanUtils.copyProperties 和 PropertyUtils.copyProperties 

四个工具类都以对七个bean此前存在name一样的习性举办管理,无论是源bean大概目的bean多出的性子均不管理。

其原理是因此JDK自带的反光机制动态的去get,set,进而去改换大家的类。

然则要留意一点他们所支撑的数据类型,还会有二个正是一旦四个类里面又写了一个类,一般叫做内部类,像那类别进行退换的时候,是不会成功的。

两个最大的界别是: 
1.BeanUtils.copyProperties会开展类型转换,而PropertyUtils.copyProperties不会。 
既然实行了类型转变,那BeanUtils.copyProperties的快慢不如PropertyUtils.copyProperties。 
据此,PropertyUtils.copyProperties应用的限制稍为窄一点,它只对名字和类型都一样的习性实行copy,假诺名字同样但项目不等同,它会报错。

 2.对null的拍卖:PropertyUtils援救为null的景观;BeanUtils对有的属性不协理null的意况,具体为下:

1)、date类型不协助;
2)、
Boolean、Ineger、Long、Short、Float、Double等不辅助:
转为false、0;
3)、string:支持,保持null;

利用BeanUtils有多少个要小心的地点: 
1.对此项目为Boolean/Short/Integer/Float/Double的性质,它会调换为false、0: 

图片 1

 1 public class User {  
 2   
 3     private Integer intVal;  
 4       
 5     private Double doubleVal;  
 6       
 7     private Short shortVal;  
 8       
 9     private Long longVal;  
10       
11     private Float floatVal;  
12       
13     private Byte byteVal;  
14       
15     private Boolean booleanVal;  
16 }  
17   
18 User src = new User();  
19 User dest = new User();  
20 BeanUtils.copyProperties(dest, src);  
21 System.out.println(src);  
22 System.out.println(dest);  
23   
24 //输出结果:      
25 User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null]  
26 User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]  

View Code

分解正是因为这多少个类型都有相应的主题项目,在进展类型转变时,有希望碰着类似Integer
->
int的转变,此时确定不能够对int类型的脾性赋值为null,由此统一改造为0。 

怎么让它并非转为0呢?能够这么:

图片 2

1 import org.apache.commons.beanutils.converters.IntegerConverter;  
2   
3 IntegerConverter converter = new IntegerConverter(null);    //默认为null,而不是0  
4 BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
5 beanUtilsBean.getConvertUtils().register(converter, Integer.class);

View Code

2.对此java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time这多少个类,若是值为null,则在copy时会抛极度,须要运用相应的Conveter: 

图片 3

 1 public class User2 {  
 2   
 3     private java.util.Date javaUtilDateVal;  
 4       
 5     private java.sql.Date javaSqlDateVal;  
 6       
 7     private java.sql.Timestamp javaSqlTimeStampVal;  
 8       
 9     private BigDecimal bigDecimalVal;  
10   
11     private java.sql.Time javaSqlTime;  
12   
13 }  
14   
15 User2 src = new User2();  
16 User2 dest = new User2();  
17   
18 BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
19   
20 //如果没有下面几行,则在转换null时会抛异常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal'  
21 //在org.apache.commons.beanutils.converters这个包下面有很多的Converter,可以按需要使用  
22 beanUtilsBean.getConvertUtils().register(new BigDecimalConverter(null), BigDecimal.class);  
23 beanUtilsBean.getConvertUtils().register(new DateConverter(null), java.util.Date.class);  
24   
25 beanUtilsBean.getConvertUtils().register(new SqlTimestampConverter(null), java.sql.Timestamp.class);  
26 beanUtilsBean.getConvertUtils().register(new SqlDateConverter(null), java.sql.Date.class);  
27 beanUtilsBean.getConvertUtils().register(new SqlTimeConverter(null), java.sql.Time.class);  
28   
29 beanUtilsBean.copyProperties(dest, src);  
30 System.out.println(src);  
31 System.out.println(dest);  

View Code

设固然从A复制到B: 
供给1:假设B中某字段有值(不为null),则该字段不复制;也便是B中该字段没值时,才开展复制,适合于对B实行补充钱的景观。

图片 4

 1 import org.apache.commons.beanutils.BeanUtilsBean;  
 2 import org.apache.commons.beanutils.PropertyUtils;  
 3   
 4 public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{  
 5   
 6     @Override  
 7     public void copyProperty(Object bean, String name, Object value)  
 8             throws IllegalAccessException, InvocationTargetException {  
 9         try {  
10             Object destValue = PropertyUtils.getSimpleProperty(bean, name);  
11             if (destValue == null) {  
12                 super.copyProperty(bean, name, value);  
13             }  
14         } catch (NoSuchMethodException e) {  
15             throw new RuntimeException(e);  
16         }  
17     }  
18   
19 }  

View Code

急需2:如若A中某字段没值(为null),则该字段不复制,也正是永不把null复制到B当中。

图片 5

 1 import org.apache.commons.beanutils.BeanUtilsBean;  
 2   
 3 public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean {  
 4   
 5     @Override  
 6     public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {  
 7         if (value == null) {  
 8             return;  
 9         }  
10         super.copyProperty(bean, name, value);  
11     }  
12 }

View Code

 

BeanUtils.copyProperties 和 PropertyUtils.copyProperties
多个工具类都以对三个bean在此之前存在name同样的性质举办管理…

BeanUtils.copyProperties 和 PropertyUtils.copyProperties 

对象属性复制二种方法的频率,对象复制两种效用

对象属性复制的二种方式:

1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties二种办法

  BeanUtils.copyProperties(“调换后的类”, “要更换的类”);
//多一步类型转变,比PropertyUtils效能还差

  PropertyUtils.copyProperties(“转变后的类”, “要转变的类”);

  口诀:后付费(后付前:前面包车型地铁复制给前方)会抛分外

2.spring提供的BeanUtil.copyProperties方式

  BeanUtils.copyProperties(“要调换的类”, “转变后的类”); 

  和Apache参数顺序相反

3.cglib提供的copy方式

  BeanCopier copy=BeanCopier.create(“要转变的类”, “转变后的类”, false);

  copy.copy(from, to, null);

4.spring提供的copy方式

  BeanCopier copy=BeanCopier.create(“要转移的类”, “转变后的类”, false);

  copy.copy(from, to, null);

 

图片 6

1 /**
2  * Created by hunt on 2017/6/28.
3  */
4 @Data
5 public class TestFrom {
6     private String name;
7 }

View Code

 

图片 7

1 import lombok.Data;
2 
3 /**
4  * Created by hunt on 2017/6/28.
5  */
6 @Data
7 public class TestTo {
8     private String name;
9 }

View Code

先是种Apache情势的BeanUtils作用测量试验:

图片 8

 1 import org.apache.commons.beanutils.BeanUtils;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 
 5 /**
 6  * Created by hunt on 2017/6/28.
 7  */
 8 public class TestDemo {
 9     public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
10         TestFrom testFrom = new TestFrom();
11         testFrom.setName("hunt");
12         TestTo testTo = new TestTo();
13         long begin = System.currentTimeMillis();
14         for (int i = 0; i <1000000 ; i++) {//一百万次
15             BeanUtils.copyProperties(testTo,testFrom);
16         }
17         long end = System.currentTimeMillis();
18         long mis = end -begin;
19         System.out.println("apache的BeanUtils.copyProperties耗时" + mis +"毫秒");
20         System.out.println(testTo);
21     }
22 }

View Code

图片 9

率先种Apache形式的PropertyUtils功效测量检验:

图片 10

 1 import org.apache.commons.beanutils.PropertyUtils;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 
 5 /**
 6  * Created by hunt on 2017/6/28.
 7  */
 8 public class TestDemo {
 9     public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
10         TestFrom testFrom = new TestFrom();
11         testFrom.setName("hunt");
12         TestTo testTo = new TestTo();
13         long begin = System.currentTimeMillis();
14         for (int i = 0; i <1000000 ; i++) {//一百万次
15             PropertyUtils.copyProperties(testTo,testFrom);
16         }
17         long end = System.currentTimeMillis();
18         long mis = end -begin;
19         System.out.println("apache的PropertyUtils.copyProperties耗时" + mis +"毫秒");
20         System.out.println(testTo);
21     }
22 }

View Code

图片 11

第二种Spring方式的BeanUtils效能测验:

图片 12

 1 import org.springframework.beans.BeanUtils;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanUtils.copyProperties(testFrom,testTo);//没抛异常
14         }
15         long end = System.currentTimeMillis();
16         long mis = end -begin;
17         System.out.println("Spring的PropertyUtils.copyProperties耗时" + mis +"毫秒");
18         System.out.println(testTo);
19     }
20 }

View Code

图片 13

其三种艺术cglib的copy效用测量检验

图片 14

 1 import net.sf.cglib.beans.BeanCopier;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false);
14             copier.copy(testFrom,testTo,null);
15         }
16         long end = System.currentTimeMillis();
17         long mis = end -begin;
18         System.out.println("cglib的copier.copy耗时" + mis +"毫秒");
19         System.out.println(testTo);
20     }
21 }

View Code

图片 15

第各个方法Spring的copy效用测量检验

图片 16

 1 import org.springframework.cglib.beans.BeanCopier;
 2 
 3 /**
 4  * Created by hunt on 2017/6/28.
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         TestFrom testFrom = new TestFrom();
 9         testFrom.setName("hunt");
10         TestTo testTo = new TestTo();
11         long begin = System.currentTimeMillis();
12         for (int i = 0; i <1000000 ; i++) {//一百万次
13             BeanCopier copier = BeanCopier.create(TestFrom.class,TestTo.class,false);
14             copier.copy(testFrom,testTo,null);
15         }
16         long end = System.currentTimeMillis();
17         long mis = end -begin;
18         System.out.println("Spring的copier.copy耗时" + mis +"毫秒");
19         System.out.println(testTo);
20     }
21 }

View Code

图片 17

 

 

小结:那多种方法的频率是由低到高。(注意Apache的PropertyUtils不能够开始展览类型转变的主题材料)

对象属性复制的二种方法:
1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties二种方…

对象属性复制的两种方式:

BeanUtils.copyProperties与PropertyUtils.copyProperties用法及界别,propertiesutils.copy

一、简介:
BeanUtils提供对Java反射和反思API的卷入。其首要目标是使用反射机制对JavaBean的属性举行管理。大家通晓,三个JavaBean平日饱含了汪洋的性质,相当多场地下,对JavaBean的管理导致大气get/set代码堆放,扩展了代码长度和阅读代码的难度。它需求Collections包和logging包的支撑。

二、用法:
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对象,古板的办法是应用类似下边包车型客车言辞对属性每个赋值:

//得到TeacherForm

TeacherForm 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后,代码就大大改观了,如下所示:

//得到TeacherForm
TeacherForm 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行的冗长、轻便失误和高频的get和set方法调用。那太棒了!太强大了!太有用
了!

今昔,还会有一个坏音信:使用BeanUtils的资金惊人地昂贵!小编做了一个回顾的测量试验,BeanUtils所开销的日子要赶过取数
据、将其复制到对应的
value对象(通过手动调用get和set方法),以及通过串行化将其回来到长途的客户机的年华总和。所以要小心使用这种威力!

一、简要介绍:
BeanUtils提供对Java反射和反省API的包裹。其重要目标是利…

多少个工具类都是对八个bean以前存在name一样的质量举办管理,无论是源bean只怕指标bean多出的性质均不管理。

1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties二种办法

其规律是通过JDK自带的反光机制动态的去get,set,进而去转变大家的类。

  BeanUtils.copyProperties(“调换后的类”, “要转移的类”);
//多一步类型调换,比PropertyUtils功能还差

而是要留意一点他们所支撑的数据类型,还大概有七个正是只要多个类里面又写了一个类,一般叫做内部类,像这种类实行转变的时候,是不会马到功成的。

  PropertyUtils.copyProperties(“调换后的类”, “要转移的类”);

两个最大的区分是: 
1.BeanUtils.copyProperties会开始展览类型转变,而PropertyUtils.copyProperties不会。 
既是进行了类型调换,那BeanUtils.copyProperties的快慢比不上PropertyUtils.copyProperties。 
之所以,PropertyUtils.copyProperties应用的限制稍为窄一点,它只对名字和花色都平等的天性进行copy,假如名字同样但项目不等同,它会报错。

  口诀:后付费(后付前:后边的复制给后面)会抛卓殊

 2.对null的管理:PropertyUtils援助为null的场地;BeanUtils对有个别属性不补助null的场地,具体为下:

2.spring提供的BeanUtil.copyProperties方式

1)、date类型不支持;
2)、
Boolean、Ineger、Long、Short、Float、Double等不协理:
转为false、0;
3)、string:支持,保持null;

  BeanUtils.copyProperties(“要转移的类”, “调换后的类”); 

使用BeanUtils有多少个要专注的地方: 
1.对此项目为Boolean/Short/Integer/Float/Double的天性,它会更动为false、0: 

  和Apache参数顺序相反

图片 18图片 19

3.cglib提供的copy方式

 1 public class User {  
 2   
 3     private Integer intVal;  
 4       
 5     private Double doubleVal;  
 6       
 7     private Short shortVal;  
 8       
 9     private Long longVal;  
10       
11     private Float floatVal;  
12       
13     private Byte byteVal;  
14       
15     private Boolean booleanVal;  
16 }  
17   
18 User src = new User();  
19 User dest = new User();  
20 BeanUtils.copyProperties(dest, src);  
21 System.out.println(src);  
22 System.out.println(dest);  
23   
24 //输出结果:      
25 User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null]  
26 User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]  

  BeanCopier copy=BeanCopier.create(“要调换的类”, “调换后的类”, false);