BeanUtils.copyProperties和普通赋值比较

其实不难理解,一看代码就知道spring用反射究竟多做了多少事情

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;

for (PropertyDescriptor targetPd : targetPds) {
if (targetPd.getWriteMethod() != null &&
            (ignoreProperties == null || (!ignoreList.contains(targetPd.getName())))) {
         PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
if (sourcePd != null && sourcePd.getReadMethod() != null) {
try {
               Method readMethod = sourcePd.getReadMethod();
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
                  readMethod.setAccessible(true);
               }
               Object value = readMethod.invoke(source);
               Method writeMethod = targetPd.getWriteMethod();
if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                  writeMethod.setAccessible(true);
               }
               writeMethod.invoke(target, value);
            }
catch (Throwable ex) {
throw new FatalBeanException("Could not copy properties from source to target", ex);
            }
         }
      }
   }
}
 

 

大致过程是,现根据object获得class,根据class获得PropertyDescriptor[],然后获得此property的WriteMethod,判断这个method是否是虚方法,是否是public,如果都ok了,就调用这个method赋值,【每一个method都会进行这轮判断】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博士通

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值