关于Spring的BeanUtils

文章《用Spring的BeanUtils前,建议你先了解这几个坑》里面,作者最后得到了这几个结论:

1.Spring得BeanUtils得CopyProperties方法需要对应得属性有getter和setter方法;2.如果存在属性完全相同得内部类,但是不是同一个内部类,即分别属于各自得内部类,则Spring会认为属性不同,不会Copy;3.泛型只在编译期起作用,不能依靠泛型来做运行期得限制;4.最后,Spring和Apache得copy属性得方法源和目的参数得位置正好相反,所以导包和调用得时候需要注意以下。在这里,我们今天重点说的是第二点,第一点是因为用反射拿到set和get方法再去拿属性值和设置属性值的,不懂反射的人可以自行百度下。第三和第四点很简单了应该是不需要解释的。

验证

首先,我把我自己的测试代码也贴出来:

@Datapublic class TestEntity{private Integer age;private String name;private Inner inner;

    @Data
    public static class Inner{
        private Integer a;
        public Inner(Integer a){
            this.a = a;
        }
    }

}

@Datapublic class TestVO{private Integer age;private String name;private Inner inner;

    @Data
    public static class Inner{
        private Integer a;
        public Inner(Integer a){
            this.a = a;
        }
    }

}

public class Main{public static void main(String args[]){TestEntity entity = new TestEntity();entity.setAge(1);entity.setName("hehe");entity.setInner(new TestEntity.Inner(1));

        TestVO vo = new TestVO();
        BeanUtils.copyProperties(entity,vo);
        System.out.println(vo.toString());
    }
    

}以上就是我得三个类,是不是超级简单,比如工作中将entity转vo,就有这种使用场景,运行main方法,测试结果和那个作者得出的第二点的结论是一样的,b对象里面的inner是null!

file但是这个是为什么呢?这个是BUG吗?这个也是我今天要说的重点。

内部类

我们知道,java给我们提供了内部类这样的东东,但是java的内部类,它其实只是java的一个语法糖而已(不知道什么是语法糖的请自行百度),那么我们定义得两个JAVA类里面的Inner的真面目到底是怎样的呢?

来到编译后的.class文件目录下,我们可以看到编译后得.class文件:

file哈哈,不知道读者到这里是不是能明白些什么了呢?为什么经过BeanUtils.CopyProperties(entity,vo)之后,vo里面的inner还是null,因为TestEntity.java和TestVO.java里面的Inner在编译之后的class名字都不一样(代表加载到虚拟机之后的地址不同),怎么可能拷贝成功呢?

那么问题来了哈,我们怎样用才能让其拷贝成功呢?我稍微修改了下我的代码如下:

@Datapublic class TestVO{private Integer age;private String name;private TestEntity.Inner inner;

}仅仅是把Inner变为了TestEntity.Inner,删掉了没引用得内部类Inner,Main.java不变,然后运行结果如下:

file可以看到,b对象里面的inner被成功拷贝过来。

此时编译后得class文件也由5个变为了4个file

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值