zoukankan      html  css  js  c++  java
  • 【转】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;
                   }
               }

           }

        }

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

  • 相关阅读:
    21 情态动词
    20 动词的用法
    19 完成时/现在完成时和过去完成时的区别
    18 将来时
    17 一般过去时和过去进行时
    16 一般现在时和现在进行时
    15 There / Here be句型
    14 不定量表达法
    13 副词
    12 形容词
  • 原文地址:https://www.cnblogs.com/niutouzdq/p/4535494.html
Copyright © 2011-2022 走看看