`
oufeng1983
  • 浏览: 25133 次
社区版块
存档分类
最新评论

重写org.apache.commons.beanutils.PropertyUtilsBean的copyPropert

阅读更多
在使用用struts的actionForm时要把属性拷到BO对象时发现org.apache.commons.beanutils.PropertyUtilsBean的copyPropert有些问题:如不能把字符字符串转为Long类型(作为公共工具类本应是这样)为了适应开发需要我重写了copyPropert方法.下面贴出来
java 代码
  1. package com.zhgrd.basic.util;   
  2.   
  3. import java.beans.PropertyDescriptor;   
  4. import java.lang.reflect.InvocationTargetException;   
  5. import java.lang.reflect.Method;   
  6. import java.util.Iterator;   
  7. import java.util.Map;   
  8.   
  9. import org.apache.commons.beanutils.BeanUtilsBean;   
  10. import org.apache.commons.beanutils.ContextClassLoaderLocal;   
  11. import org.apache.commons.beanutils.DynaBean;   
  12. import org.apache.commons.beanutils.DynaProperty;   
  13. import org.apache.commons.beanutils.PropertyUtils;   
  14. import org.apache.commons.beanutils.PropertyUtilsBean;   
  15. import org.apache.commons.logging.Log;   
  16. import org.apache.commons.logging.LogFactory;   
  17. /**  
  18.  * 是基于org.apache.commons.beanutils的  
  19.  * 便于把form中的值拷到Bo对象中  
  20.  * 如Bo中没有的属性在form中存在则不拷贝,  
  21.  * 如果目标对象中的属性类型为Long型而拷贝对象为String则把String转为Long  
  22.  * @author ou  
  23.  *  
  24.  */  
  25. public class ObjectPropertyUtilsBean extends PropertyUtilsBean{   
  26.     Log log = LogFactory.getLog(ObjectPropertyUtilsBean.class);   
  27.        
  28.        
  29.      private static final ContextClassLoaderLocal beansByClassLoader = new ContextClassLoaderLocal() {   
  30.                  // Creates the default instance used when the context classloader is unavailable   
  31.                  protected Object initialValue() {   
  32.                      return new ObjectPropertyUtilsBean();   
  33.                  }   
  34.              };   
  35.     public static ObjectPropertyUtilsBean getInstance(){   
  36.         return (ObjectPropertyUtilsBean)beansByClassLoader.get();   
  37.     }   
  38.     public void copyProperties(Object dest, Object orig)   
  39.             throws IllegalAccessException, InvocationTargetException,   
  40.             NoSuchMethodException {   
  41.   
  42.         if (dest == null) {   
  43.             throw new IllegalArgumentException ("目标对象为空");   
  44.         }   
  45.         if (orig == null) {   
  46.             throw new IllegalArgumentException("没有拷贝对象");   
  47.         }   
  48.   
  49.         if (orig instanceof DynaBean) {   
  50.             DynaProperty origDescriptors[] =   
  51.                 ((DynaBean) orig).getDynaClass().getDynaProperties();   
  52.             for (int i = 0; i < origDescriptors.length; i++) {   
  53.                 String name = origDescriptors[i].getName();   
  54.                 if (dest instanceof DynaBean) {   
  55.                     if (isWriteable(dest, name)) {   
  56.                         Object value = ((DynaBean) orig).get(name);   
  57.                         ((DynaBean) dest).set(name, value);   
  58.                     }   
  59.                 } else /* if (dest是一个标准的JavaBean) */ {   
  60.                     if (isWriteable(dest, name)) {   
  61.                         Object value = ((DynaBean) orig).get(name);   
  62.                         setSimpleProperty(dest, name, value);   
  63.                     }   
  64.                 }   
  65.             }   
  66.         } else if (orig instanceof Map) {   
  67.             Iterator names = ((Map) orig).keySet().iterator();   
  68.             while (names.hasNext()) {   
  69.                 String name = (String) names.next();   
  70.                 if (dest instanceof DynaBean) {   
  71.                     if (isWriteable(dest, name)) {   
  72.                         Object value = ((Map) orig).get(name);   
  73.                         ((DynaBean) dest).set(name, value);   
  74.                     }   
  75.                 } else /* if (dest is a standard JavaBean) */ {   
  76.                     if (isWriteable(dest, name)) {   
  77.                         Object value = ((Map) orig).get(name);   
  78.                         setSimpleProperty(dest, name, value);   
  79.                     }   
  80.                 }   
  81.             }   
  82.         } else /* if (orig is a standard JavaBean) */ {   
  83.             PropertyDescriptor origDescriptors[] =   
  84.                 getPropertyDescriptors(orig);   
  85.             for (int i = 0; i < origDescriptors.length; i++) {   
  86.                 String name = origDescriptors[i].getName();   
  87.                 if (isReadable(orig, name)) {   
  88.                     if (dest instanceof DynaBean) {   
  89.                         if (isWriteable(dest, name)) {   
  90.                             Object value = getSimpleProperty(orig, name);   
  91.                             ((DynaBean) dest).set(name, value);   
  92.                         }   
  93.                     } else /* if (dest is a standard JavaBean) */ {   
  94.                         if (isWriteable(dest, name)) {   
  95.                             Object value = getSimpleProperty(orig, name);   
  96.                             setSimpleProperty(dest, name, value);   
  97.                         }   
  98.                     }   
  99.                 }   
  100.             }   
  101.         }   
  102.   
  103.     }   
  104.        
  105.        
  106.        
  107.     public void setSimpleProperty(Object bean,String name, Object value)throws IllegalAccessException, InvocationTargetException,   
  108.             NoSuchMethodException {   
  109.   
  110.         if (bean == null) {   
  111.             throw new IllegalArgumentException("对象为空");   
  112.         }   
  113.         if (name == null) {   
  114.             throw new IllegalArgumentException("属性名为空");   
  115.         }   
  116.   
  117.         // Validate the syntax of the property name   
  118.         if (name.indexOf(PropertyUtils.NESTED_DELIM) >= 0) {   
  119.             throw new IllegalArgumentException ("属性名不规范");   
  120.         } else if (name.indexOf(PropertyUtils.INDEXED_DELIM) >= 0) {   
  121.             throw new IllegalArgumentException("属性名不规范");   
  122.         } else if (name.indexOf(PropertyUtils.MAPPED_DELIM) >= 0) {   
  123.             throw new IllegalArgumentException ("属性名不规范");   
  124.         }   
  125.   
  126.         // Handle DynaBean instances specially   
  127.         if (bean instanceof DynaBean) {   
  128.             DynaProperty descriptor =((DynaBean) bean).getDynaClass().getDynaProperty(name);   
  129.             if (descriptor == null) {//不存在该属性   
  130.                 return;   
  131.             }   
  132.             ((DynaBean) bean).set(name, value);   
  133.             return;   
  134.         }   
  135.   
  136.         // Retrieve the property setter method for the specified property   
  137.         PropertyDescriptor descriptor = getPropertyDescriptor(bean, name);   
  138.         if (descriptor == null) {//不存在该属性   
  139.             return;   
  140.         }   
  141.         Method writeMethod = getWriteMethod(descriptor);   
  142.         if (writeMethod == null) {   
  143.             throw new NoSuchMethodException("属性 '" + name + "' 没有Setter方法");   
  144.         }   
  145.         Class cl = getPropertyType(bean, name);   
  146.         if(value != null)/*在这你可加上把复制对象属性转为目标类属性的代码*/  
  147.         if(!cl.getName().equals(value.getClass().getName())){   
  148.             if(cl.getName().equals(Long.class.getName())){   
  149.                 if(value.getClass().getName().equals(String.class.getName()))   
  150.                     value = Long.valueOf((String)value);   
  151.                
  152.             }   
  153.         }   
  154.                
  155.         // Call the property setter method   
  156.         Object values[] = new Object[1];   
  157.         values[0] = value;   
  158.         invokeMethod(writeMethod, bean, values);   
  159.   
  160.     }   
  161.        
  162.     private Object invokeMethod(   
  163.             Method method,    
  164.             Object bean,    
  165.             Object[] values)    
  166.                 throws  
  167.                     IllegalAccessException,   
  168.                     InvocationTargetException {   
  169.                 try {   
  170.                    
  171.                 return method.invoke(bean, values);   
  172.                    
  173.                 } catch (IllegalArgumentException e) {   
  174.                    
  175.                 log.error("方法反射失败.", e);   
  176.                 throw new IllegalArgumentException(   
  177.                     "不能反射: " + method.getDeclaringClass().getName() + "."    
  178.                     + method.getName() + " - " + e.getMessage());   
  179.                    
  180.                 }   
  181.             }   
  182.   
  183.   
  184. }   
下面还要写一个类PropertyUtil爆露一个静态方法来使用copyPropert
java 代码
  1. package com.zhgrd.basic.util;   
  2.   
  3. import java.lang.reflect.InvocationTargetException;   
  4. import org.apache.commons.beanutils.PropertyUtils;   
  5.   
  6.   
  7. public class PropertyUtil extends PropertyUtils{   
  8.      public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException,   
  9.      NoSuchMethodException {   
  10.              ObjectPropertyUtilsBean.getInstance().copyProperties(dest, orig);   
  11.     }   
  12. }   
好了现在可以使用了.
java 代码
  1.         SysUserForm tform = (SysUserForm)form;   
  2.         try{   
  3.             PropertyUtil.copyProperties(tsysUser, tform);   
  4.         }catch(Exception ex){   
  5.             logger.debug("属性拷贝异常:");   
  6.             ex.printStackTrace();   
  7. }  

仅供学习.本人不保证上面代码正确.

分享到:
评论

相关推荐

    Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier

    首先,Apache BeanUtils是Apache Commons项目的一部分,提供了一系列便捷的工具方法用于Bean的操作,包括属性的复制。它使用反射机制实现,通过getter和setter方法进行属性的读写。其优点在于简单易用,但缺点是在...

    apache commons 文档

    本知识点将围绕Apache Commons文档中的关键组件展开,涵盖Apache Commons Lang、Commons BeanUtils、Commons Collections等常用模块的核心功能。 ### Apache Commons Lang Apache Commons Lang库提供了大量用于处理...

    Struts1.xpdf文件

    - `commons-beanutils-1.7.0.jar`: 用于简化Bean操作,如属性复制等。 - `commons-chain-1.1.jar`: 提供了一种链式处理机制。 - `commons-digester-1.8.jar`: 用于解析XML配置文件。 - `commons-logging-1.0.4.jar`:...

    使用Quartz执行定时任务

    `commons-lang-2.0.jar`、`commons-beanutils-1.6.1.jar`、`commons-digester-1.5.jar`和`commons-logging-1.1.1.jar`都是Apache Commons项目中的组件,它们提供了各种实用工具类,如字符串操作、Bean操作、XML解析...

    Tomcat启动时类加载顺序

    - 例如,如果某个jar文件的MANIFEST.MF中指定了`Class-Path: commons-beanutils.jar`等,那么在加载该jar时,会先加载这些依赖的jar文件。 #### 五、总结 理解Tomcat启动时类加载的顺序对于排查类加载异常、避免类...

    java自定义枚举转换器示例

    import org.apache.commons.beanutils.Converter; public class MyEnumConverter implements Converter { @Override // 将value 转换为 c 类型 --- 枚举通用转换器 public Object convert(Class c, Object value...

    JavaWeb阶段学习笔记

    import org.apache.commons.beanutils.BeanUtils; // 复制属性 BeanUtils.copyProperties(targetBean, sourceBean); ``` 以上就是关于JavaWeb阶段的学习笔记,重点介绍了Servlet的基本概念和开发流程、...

    android客户端与服务器端的搭建.ppt

    2. commons-beanutils.jar 3. commons-collections.jar 4. commons-logging.jar 5. ezmorph.jar 6. json-lib-2.2.2-jdk15.jar 在Struts2的配置文件`struts.xml`中,需要进行如下修改: 1. 扩展名改为`json-default`...

    xml操作的例子

    - Apache Commons Digester和BeanUtils等Apache Commons组件简化了XML与Java对象的绑定。 总之,Java提供了多种处理XML的方法,从基本的DOM和SAX到高级的JAXB和XSLT,开发者可以根据具体需求选择合适的技术。理解...

    xml 与JAVAbean转换

    **工具** 如Apache Commons BeanUtils库也可以用来在JavaBean和Map对象之间进行转换,虽然它不直接处理XML,但可以作为进一步转换的基础。此外,一些IDE如Eclipse和IntelliJ IDEA提供了内置的功能来自动生成JavaBean...

    Java基础总结.pdf

    6. BeanUtils是Apache Commons BeanUtils库中的一个工具类,它提供了对JavaBean属性进行操作的方法,如copyBeans()用于属性复制。 7. StringBuffer是一个可变的字符序列,它提供了许多方法,如append()和insert(),...

    程序员成长学习要求

    - `Commons-beanutils`:简化JavaBean的操作。 - `Commons-io`:提供了一组强大的IO操作工具。 - `log4j`:日志记录框架,支持不同的日志级别和格式化输出。 5. **MyBatis**:一种优秀的持久层框架,学习其核心...

    struts用法总结

    - commons-beanutils.jar:提供根据类路径创建对象的方法。 - commons-digester.jar:解析XML文件。 - commons-fileupload.jar:支持文件上传功能。 - commons-logging.jar:日志输出,如Log4j。 - commons-...

    dom4j jstl beanUtil log4j等jar包

    3. **BeanUtils**:通常指的是Apache Commons BeanUtils库,它是Apache Commons项目的一部分,提供了各种工具方法,帮助开发者更方便地操作JavaBeans。BeanUtils可以自动转换数据类型,复制属性,甚至根据setter和...

    jstl(jsp标准标签)

    JSTL的函数库引入了来自Apache Commons Lang和Apache Commons BeanUtils库的许多有用函数,方便在JSP页面中进行字符串操作、日期处理等。 **5. XML库(XML)** XML库允许在JSP页面上处理XML文档,包括解析XML、创建...

    《剑指offer》Java浅拷贝和深拷贝.pdf

    此外,还可以使用其他拷贝方式,比如使用`copy-constructor`(构造函数的副本)或`BeanUtils.copyProperties()`(Apache Commons BeanUtils库提供),但这些方法也需根据具体情况判断是否能实现深拷贝。 总之,理解...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    4. **使用工具类或库**:例如,Apache Commons Lang库提供了`BeanUtils.copyProperties()`方法,可以方便地将一个对象的所有属性复制到另一个对象。这种方法简单易用,但需要注意的是,如果源对象和目标对象有属性...

    Java 细数浅拷贝和深拷贝

    - 使用Apache Commons Lang库中的`BeanUtils.copyProperties`方法。 - 使用第三方库如Guava提供的拷贝工具。 #### 总结 在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象...

    JTable排序

    另一种方法是使用第三方库,如Apache Commons BeanUtils的`TableSorter`类。 ### TableSorter类 在提供的文件列表中,`TableSorter.java`很可能是一个实现了排序功能的类。`TableSorter`通常是一个模型类,它扩展了...

Global site tag (gtag.js) - Google Analytics