主要是对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