日期:2014-05-20 浏览次数:20924 次
看吧:
public void copyProperties(Object dest, Object orig)
throws IllegalAccessException, InvocationTargetException
{
if(dest == null)
throw new IllegalArgumentException("No destination bean specified");
if(orig == null)
throw new IllegalArgumentException("No origin bean specified");
if(log.isDebugEnabled())
log.debug("BeanUtils.copyProperties(" + dest + ", " + orig + ")");
if(orig instanceof DynaBean)
{
DynaProperty origDescriptors[] = ((DynaBean)orig).getDynaClass().getDynaProperties();
for(int i = 0; i < origDescriptors.length; i++)
{
String name = origDescriptors[i].getName();
if(getPropertyUtils().isWriteable(dest, name))
{
Object value = ((DynaBean)orig).get(name);
copyProperty(dest, name, value);
}
}
} else
if(orig instanceof Map)
{
for(Iterator names = ((Map)orig).keySet().iterator(); names.hasNext();)
{
String name = (String)names.next();
if(getPropertyUtils().isWriteable(dest, name))
{
Object value = ((Map)orig).get(name);
copyProperty(dest, name, value);
}
}
} else
{
PropertyDescriptor origDescriptors[] = getPropertyUtils().getPropertyDescriptors(orig);
for(int i = 0; i < origDescriptors.length; i++)
{
String name = origDescriptors[i].getName();
if(!"class".equals(name) && getPropertyUtils().isReadable(orig, name) && getPropertyUtils().isWriteable(dest, name))
try
{
Object value = getPropertyUtils().getSimpleProperty(orig, name);
copyProperty(dest, name, value);
}
catch(NoSuchMethodException e) { }
}
}
}
public void copyProperty(Object bean, String name, Object value)
throws IllegalAccessException, InvocationTargetException
{
if(log.isTraceEnabled())
{
StringBuffer sb = new StringBuffer(" copyProperty(");
sb.append(bean);
sb.append(", ");
sb.append(name);
sb.append(", ");
if(value == null)
sb.append("<NULL>");
else
if(value instanceof String)
sb.append((String)value);
else
if(value instanceof String[])
{
String values[] = (String[])value;
sb.append('[');
for(int i = 0; i < values.length; i++)
{
if(i > 0)
sb.append(',');
sb.append(values[i]);
}
sb.append(']');
} else
{
sb.append(value.toString());
}
sb.append(')');
log.trace(sb.toString());
}
Object target = bean;
int delim = name.lastIndexOf('.');
if(delim >= 0)
{
try
{
target = getPropertyUtils().getProperty(bean, name.substring(0, delim));
}
catch(NoSuchMethodException e)
{
return;
}
name = name.substring(delim + 1);
if(log.isTraceEnabled())
{
log.trace(" Target bean = " + target);
log.trace(" Target name = " + name);
}
}
String propName = null;
Class type = null;
int index = -1;
String key = null;
propName = name;
int i = propName.indexOf('[');
if(i >= 0)
{
int k = propName.indexOf(']');
try
{
index = Integer.parseInt(propName.substring(i + 1, k));
}
catch(NumberFormatException e) { }
propName = propName.substring(0, i);
}
int j = propName.indexOf('(');
if(j >= 0)
{
int k = propName.indexOf(')');
try
{
key = propName.substring(j + 1, k);
}
catch(IndexOutOfBoundsException e) { }
propName = propName.substring(0, j);
}
if(target instanceof DynaBean)
{
DynaClass dynaClass = ((DynaBean)target).getDynaClass();
DynaProperty dynaProperty = dynaClass.getDynaProperty(propName);
if(dynaProperty == null)
return;
type = dynaProperty.getType();
} else
{
PropertyDescriptor descriptor = null;
try
{
descriptor = getPropertyUtils().getPropertyDescriptor(target, name);
if(descriptor == null)
return;
}
catch(NoSuchMethodException e)
{
return;
}
type = descriptor.getPropertyType();
if(type == null)
{
if(log.isTraceEnabled())
log.trace(" target type for property '" + propName + "' is null, so skipping ths setter");
return;
}
}
if(log.isTraceEnabled())
log.trace(" target propName=" + propName + ", type=" + type + ", index=" + index + ", key=" + key);
if(index >= 0)
{
Converter converter = getConvertUtils().lookup(type.getComponentType());
if(converter != null)
{
log.trace(" USING CONVERTER " + converter);
value = converter.convert(type, value);
}
try
{
getPropertyUtils().setIndexedProperty(target, propName, index, value);
}
catch(NoSuchMethodException e)
{
throw new InvocationTargetException(e, "Cannot set " + propName);
}
} else
if(key != null)
{
try
{
getPropertyUtils().setMappedProperty(target, propName, key, value);
}
catch(NoSuchMethodException e)
{
throw new InvocationTargetException(e, "Cannot set " + propName);
}
} else
{
Converter converter = getConvertUtils().lookup(type);
if(converter != null)
{
log.trace(" USING CONVERTER " + converter);
value = converter.convert(type, value);
}
try
{
getPropertyUtils().setSimpleProperty(target, propName, value);
}
catch(NoSuchMethodException e)
{
throw new InvocationTargetException(e, "Cannot set " + propName);
}
}
}