【转】beancopy的替代方案

链接:http://jingyan.baidu.com/article/215817f7d55b871edb14235b.html

最近在项目中接触到了BeanUtils.copyProperties(),之前没怎么用过这个方法,在网上搜索了一下,发现还有一个PropertyUtils.copyProperties()的方法,下面对这两个方法做一下总结。另外,在使用的时候,程序抛出了异常,经过分析得知,异常的原因是因为赋值的对象中有一个时间类型(该属相采用java.util.Date的类型),程序无法通过,下面主要分析这两个问题。

    1. 第一步: BeanUtils.copyProperties()与PropertyUtils.copyProperties()

      1、 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。

      2、 BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到"后付前"这个词来帮助自己记忆这个功能。即将obj2的值赋值给obj1。

      3、 如果2中实例obj2为空对象,即值new了他的实例并没有赋值的话obj1对应的属性值也会被设置为空置。

      4、BeanUtils与PropertyUtils对比(这里对比copyProperties方法)

      PropertyUtils的copyProperties()方法几乎与BeanUtils.copyProperties()相同,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,BeanUtils 不支持这个功能,但是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。如果开发中Date类型采用util而非sql.Date程序会抛出argument mistype异常。

       

    2.  

      第二步:扩展BeanUtils支持时间类型转换

      import java.lang.reflect.InvocationTargetException;
      import org.apache.commons.beanutils.BeanUtils;
      import org.apache.commons.beanutils.ConvertUtils;

      /**
      * 重写BeanUtils.copyProperties
      *
      * @author monkey
      */
      public class BeanUtilsExtends extends BeanUtils {
         static {
             ConvertUtils.register(new DateConvert(), java.util.Date.class);
             ConvertUtils.register(new DateConvert(), java.sql.Date.class);
         }

         public static void copyProperties(Object dest, Object orig) {
             try {
                 BeanUtils.copyProperties(dest, orig);
             } catch (IllegalAccessException ex) {
                 ex.printStackTrace();
             } catch (InvocationTargetException ex) {
                 ex.printStackTrace();
             }
         }
      }

      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import org.apache.commons.beanutils.Converter;

      /**
      * 重写日期转换
      *
      * @author houzhiqing
      */
      public class DateConvert implements Converter {

         public Object convert(Class arg0, Object arg1) {
             String p = (String) arg1;
             if (p == null || p.trim().length() == 0) {
                 return null;
             }
             try {
                 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 return df.parse(p.trim());
             } catch (Exception e) {
                 try {
                     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                     return df.parse(p.trim());
                 } catch (ParseException ex) {
                     return null;
                 }
             }

         }

      }

      复写的想法是好的,只不过这个实现就太那啥了。。。。

原文地址:https://www.cnblogs.com/niutouzdq/p/4535494.html