`

JAVA重写copyProperties,使其支持Map类型

    博客分类:
  • Java
 
阅读更多

BeanUtils和PropertyUtils类是许多开源框架中频繁使用的两个工具,它们都能实现将一个类中的属性拷贝到另一个类中,这个功能甚至是spring实现依赖注入的基础。研究一下apache的comon包中如何实现这个两个工具,可以发现它们都是使用java.lang.reflect和java.beans这两个包下的几个类来实现的。

    但是BeanUtils.copyProperties只支持两个对象之间的复制,其原理:是利用反射读取到第一个对象(源类)的所有属性,然后对这些属性集合进行for循环,再在for循环里面判断这些属性是否有set方法,有则再对第二个对象(目标类)进行循环取出属性一一对比,相等则调用目标类的set方法得到源类的get方法得到的值。

    改后主要就是两点:第一:源类(Map类型)的Key作为属性和目标类的属性对比,相等则取出此Key的Value赋给目标类(当然还是用目标类此属性的set方法)。注意:如果是通过http请求的getParameterMap()得到的Map,其值是一个数组,一般只需要取第0项就可以了。

 

    /** 
     * 实现将源类(Map类型)属性拷贝到目标类中
     * @param Map map  源Map对象
     * @param Object obj  目标对象
     */
    public static void copyProperties(Map map, Object obj) throws Exception
    {
        // 获取目标类的属性信息
        BeanInfo targetbean = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = targetbean.getPropertyDescriptors();
        // 对每个目标类的属性查找set方法,并进行处理
        for (int i = 0; i < propertyDescriptors.length; i++)
        {
            PropertyDescriptor pro = propertyDescriptors[i];
            Method wm = pro.getWriteMethod();

            if (wm != null)
            {
                Iterator ite = map.keySet().iterator();
                while (ite.hasNext())
                {
                    String key = (String) ite.next();
                    // 判断匹配
                    if (key.toLowerCase().equals(pro.getName().toLowerCase()))
                    {
                        if (!Modifier.isPublic(wm.getDeclaringClass().getModifiers()))
                        {
                            wm.setAccessible(true);
                        }

                        Object value = ((String[]) map.get(key))[0];
                        String pt = splitSpace(pro.getPropertyType().getName());

                        // 判断类型是否匹配,不匹配则作强制转换
                        if (!(pt.equals(value.getClass().getName())))
                        {
                            value = parseByType(pro.getPropertyType(), value.toString());
                        }

                        // 调用目标类对应属性的set方法对该属性进行填充
                        wm.invoke((Object) obj, new Object[] { value });
                        break;
                    }
                }
            }
        }
    }

 

分享到:
评论

相关推荐

    java Beanutils.copyProperties( )用法详解

    Java Beanutils.copyProperties() 用法详解 Java Beanutils.copyProperties() 方法是 Java 中一个非常有用的工具,主要用于将一个 JavaBean 的属性复制到另一个 JavaBean 中。今天,我们将详细介绍 Java Beanutils....

    BeanMapper:比BeanUtils.copyProperties更快

    一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...

    java Map转换成bean,利用java反射以及java和bean包

    此外,Java标准库中提供了`org.springframework.beans.BeanUtils`或者Apache Commons Lang的`BeanUtils.copyProperties()`方法,它们提供了更完善的转换功能,包括处理嵌套属性、类型转换等。这些工具类的使用可以...

    推荐一款Java实体映射工具---mapstruct(csdn)————程序.pdf

    MapStruct 是一个强大的Java实体映射工具,它旨在简化对象之间的转换过程,特别是在处理大量属性映射时。传统的手动设置属性或使用BeanUtils.copyProperties()方法可能会效率低下,且易出错。MapStruct通过注解...

    Java工具类之Apache的Commons Lang和BeanUtils

    5. **枚举操作**:`EnumUtils`类提供了对Java枚举类型的友好支持,如枚举值的转换和检查。 6. **类型转换**:`TypeConversionUtils`和`ConvertUtils`类提供了类型之间的安全转换,避免了因类型不匹配引发的异常。 ...

    java不同对象及集合的多次复制

    - **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现对象间的属性复制,但不支持自定义复制规则。 - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,...

    Java笔记word.docx

    在处理复杂的查询条件时,如果后端期望接收的是实体类型而不是Map类型,可以使用实体类来封装查询条件。 **示例**: ```java UserQuery query = new UserQuery(); query.setName("张三"); query.setAge(25); List...

    Map和Bean灵活转换工具类

    `JavaBeanUtil`可能与`BeanUtils`相似,但可能存在一些特定的实现或扩展功能,比如支持自定义转换规则、处理复杂类型的属性等。在实际使用中,我们应根据具体需求来选择合适的工具类。 在源码层面,`MapUtils`和`...

    BeanUtilsBean对象复制使用(类型可以自动转化)

    在Java开发中,Apache Commons BeanUtils库是一个非常实用的工具包,它提供了许多方便的方法来操作JavaBeans。本文将深入探讨`BeanUtilsBean`对象复制的功能,特别关注它如何实现类型自动转换。`BeanUtilsBean`是...

    commons-beanutils-jesse.zip(20080717更新)

    apache的BeanUtils的copyProperty以及copyProperties方法不支持String与java.util.Date的类型相互转换 该包对源码进行了部分修改,使其支持对String与Date之间的类型转换。 2008-07-17更新: 增加了...

    commons-beanutils-jesse.zip

    该包对源码进行了部分修改,使其支持对String与Date之间的类型转换. 注:该包在对null的Date转换时会抛出No value specified的异常。如需支持对null的Date转换,请下载我的“commons-beanutils-jesse.zip(20080717更新...

    对象拷贝-优雅的解决方案Mapstruct.docx

    MapStruct 是一种类型安全的 bean 映射类生成 Java 注释处理器,它简化了对象间属性的映射过程。开发者只需定义一个映射接口并声明所需的映射方法,在编译过程中 MapStruct 将自动为该接口生成实现类。这种机制避免...

    java List 深度复制方法

    在Java编程中,数据结构是程序设计的基础,而List接口作为集合框架的重要组成部分,常常用于存储有序的元素序列。当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用...

    commons-beanutils-jesse.zip(20080825更新)

    该包对源码进行了部分修改,使其支持对String与Date之间的类型转换。 2008-07-17更新: 增加了BeanUtils的copyProperty以及copyProperties方法对Date的null值复制功能,取消了当Date为null时的抛异常。 2008-08-25...

    超额发票单据按照限额拆分java

    - 对于可能出现的异常情况,如数据类型不匹配、除数为零等,应提前进行检查并处理,确保程序的健壮性和稳定性。 7. **测试验证**: - 设计测试用例,覆盖各种可能的输入情况,包括但不限于正向案例、边界条件和...

    Java基础_第二阶段-day18每日作业卷答案1

    - 如果属性为复杂类型,如数组或集合,需要确保Map的值类型匹配。 - 调用BeanUtils方法时,若JavaBean属性不存在或setter/getter方法不匹配,可能会抛出异常,需做好异常处理。 5. **应用场景** BeanUtils工具...

    java开发记录方法

    根据给定的信息,我们可以整理出以下与Java开发相关的知识点: ### 1. 日期与时间处理 #### 1.1 转换字符串为日期 ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf...

    commons-beanutils-1.7.0_java_java编程_

    2. **类型转换**:BeanUtils库内置了类型转换机制,可以将字符串等类型的值转换为Java对象期望的类型,比如将字符串转换为整数、日期等。 3. **批量属性复制**:`copyProperties()`方法可以快速地将一个对象的所有...

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

    在Java中,可以通过实现`Cloneable`接口并重写`clone()`方法来实现浅拷贝。例如: ```java public class Food implements Cloneable { ... @Override protected Object clone() throws ...

Global site tag (gtag.js) - Google Analytics