对apache.commons.beanutils.BeanUtils的源码解读

来源:互联网 发布:fluent软件百度云 编辑:程序博客网 时间:2024/06/15 14:24

主要是对BeanUtils.copyProperties(param1,param2)方法的解读。

首先第一个参数是要赋值的对象,第二个参数是源Bean。

else /* if (orig is a standard JavaBean) */ {            PropertyDescriptor origDescriptors[] =                getPropertyUtils().getPropertyDescriptors(orig);
上面这段代码是判断传入参数是javabean,然后获取此bean中的属性。

参考代码:

public PropertyDescriptor[]            getPropertyDescriptors(Class beanClass) {        if (beanClass == null) {            throw new IllegalArgumentException("No bean class specified");        }        // Look up any cached descriptors for this bean class        PropertyDescriptor descriptors[] = null;        descriptors =                (PropertyDescriptor[]) descriptorsCache.get(beanClass);        if (descriptors != null) {            return (descriptors);        }        // Introspect the bean and cache the generated descriptors        BeanInfo beanInfo = null;        try {            beanInfo = Introspector.getBeanInfo(beanClass);        } catch (IntrospectionException e) {            return (new PropertyDescriptor[0]);        }        descriptors = beanInfo.getPropertyDescriptors();        if (descriptors == null) {            descriptors = new PropertyDescriptor[0];        }        descriptorsCache.put(beanClass, descriptors);        return (descriptors);    }
运用api中的内省机制获取bean的显示信息。
Introspector.getBeanInfo(beanClass);
然后在获取bean中所有属性并把集合存放到FashHashMap中作为缓存最后返回结果集。

循环返回的结果集,获取name。

然后判断param2中name是否存在get方法和param1中name是否存在set方法

for (int i = 0; i < origDescriptors.length; i++) {                String name = origDescriptors[i].getName();                if ("class".equals(name)) {                    continue; // No point in trying to set an object's class                }                if (getPropertyUtils().isReadable(orig, name) &&                    getPropertyUtils().isWriteable(dest, name)) {                    try {                        Object value =                            getPropertyUtils().getSimpleProperty(orig, name);                        copyProperty(dest, name, value);                    } catch (NoSuchMethodException e) {                        ; // Should not happen                    }                }            }

然后获得param2中的name字段值,set到param1中的name

0 0