专栏首页chenchenchen关于Spring的BeanUtils

关于Spring的BeanUtils

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_38004638/article/details/102905556

文章《用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!

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

内部类

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

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

哈哈,不知道读者到这里是不是能明白些什么了呢?为什么经过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不变,然后运行结果如下:

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot启动报错:LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

    原文链接:https://blog.csdn.net/zhanggonglalala/article/details/...

    chenchenchen
  • 深入源码分析Spring中的构造器注入

    构造器注入类,分别有三个构造器,一个是无参构造器,一个是注入一个Bean的构造器,一个是注入两个Bean的构造器:

    chenchenchen
  • 个人发展战略(一)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    chenchenchen
  • 最新热门云产品限量秒杀,云服务器1核2G 14.5元/月起

    精选秒杀热卖云产品限量抢,产品包括云服务器、MySql云数据库、热门云数据库、短信。服务稳定,价格更加优惠。秒杀链接:【新用户限量秒杀】热门云产品限量秒杀,云服...

    勤劳的小蜜蜂
  • uva Excuses, Excuses!

    题意:给几个单词,在给几个句子,输出包含最多单词的那个句子,大小写不分,末尾空行 分析:这道题能A,还是挺开心的,但不说多难,而是又学会了个函数,又知道了个细节...

    用户1624346
  • 如何用现有电子邮件地址注册 Windows Live ID

    最近遇到一些朋友问起是否能用其他的电子邮件地址作为MSN的帐号,答案是肯定的——微软官方说:您可以使用任何电子邮件提供商提供的现有电子邮件地址注册 Window...

    Enjoy233
  • 最文艺的告白方式!用这款小程序,给 Ta 点一首歌

    不过,不是人人都有一把动人的声音。想用音乐传情,也可以选择给对方点一首歌,或者独家订制音乐。

    知晓君
  • 通俗易懂--SVM算法讲解(算法+案例)

    SVM是一个很复杂的算法,不是一篇博文就能够讲完的,所以此篇的定位是初学者能够接受的程度,并且讲的都是SVM的一种思想,通过此篇能够使读着会使用SVM就行,具体...

    mantch
  • 【Android】手把手教你上滑解锁的效果

    最近,公司开发的APP中要实现类似上滑解锁效果的推荐页,捣腾了两天,基本实现了效果,附效果图如上。接下来和大家聊聊如何实现这样的效果。

    代码咖啡
  • 活学活用 PostgreSQL 逻辑复制实现 I U D 历史记录

    PostgreSQL 本身没有这样的功能的,但这里有一个想法可以来通过逻辑复制的方法来模拟这样的功能。当然通过trigger 也是可以完成这样的功能,但是考虑到...

    AustinDatabases

扫码关注云+社区

领取腾讯云代金券