BeanUtils.copyProperties()用法

来源:互联网 发布:移动刷流量软件 编辑:程序博客网 时间:2024/06/05 13:25
前言:
今天看别人写的代码,在action里面看到有人用了BeanUtils.copyProperties(obj, objForm);

感觉很奇怪于是就点击进去看了一下源码

public static void copyProperties(Object source, Object target) throws BeansException {        copyProperties(source, target, (Class)null, (String[])null);    }

private static void copyProperties(Object source, Object target, Class<?> editable, String... ignoreProperties) throws BeansException {        Assert.notNull(source, "Source must not be null");        Assert.notNull(target, "Target must not be null");        Class<?> actualEditable = target.getClass();        if(editable != null) {            if(!editable.isInstance(target)) {                throw new IllegalArgumentException("Target class [" + target.getClass().getName() + "] not assignable to Editable class [" + editable.getName() + "]");            }            actualEditable = editable;        }        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);        List<String> ignoreList = ignoreProperties != null?Arrays.asList(ignoreProperties):null;        PropertyDescriptor[] var7 = targetPds;        int var8 = targetPds.length;        for(int var9 = 0; var9 < var8; ++var9) {            PropertyDescriptor targetPd = var7[var9];            Method writeMethod = targetPd.getWriteMethod();            if(writeMethod != null && (ignoreProperties == null || !ignoreList.contains(targetPd.getName()))) {                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());                if(sourcePd != null) {                    Method readMethod = sourcePd.getReadMethod();                    if(readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {                        try {                            if(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {                                readMethod.setAccessible(true);                            }                            Object value = readMethod.invoke(source, new Object[0]);                            if(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {                                writeMethod.setAccessible(true);                            }                            writeMethod.invoke(target, new Object[]{value});                        } catch (Throwable var15) {                            throw new FatalBeanException("Could not copy property '" + targetPd.getName() + "' from source to target", var15);                        }                    }                }            }        }    }

大概功能就是利用反射机制对JavaBean的属性进行处理。这样做的好处就是当一个JavaBean中包含了大量的属性时,可以省略对JavaBean的大量get/set操作,使代码阅读更方便,当你要处理的属性发生改变时不用改动底层代码,因为BeanUtils给你自动注入,进行解耦。

注意:如果obj与ob jForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要手动处理。


原创粉丝点击