关于Spring的BeanUtils

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

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

验证

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

@Data
public 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;
    }
}

}

@Data
public 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名字都不一样(代表加载到虚拟机之后的地址不同),怎么可能拷贝成功呢?

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

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

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


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

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

原文地址:https://www.cnblogs.com/chen-chen-chen/p/11794871.html

时间: 2024-10-14 10:12:44

关于Spring的BeanUtils的相关文章

Apache的BeanUtils和PropertyUtils,Spring的BeanUtils,Cg

作为一个新员工,一个首要的工作就是阅读别人的代码,阅读代码的诸多好处就不说了,我就直奔主题,通过预读代码,发现了几种实现两个不同类型的Bean之间实现值复制的几种方式,上网查询后发现性能上会有差异,于是就萌生自己深入了解几种实现的想法.第一步就是先本着实事求是的原则去探求一下大家总结出来的性能差异是否正确. 比较的是四种复制的方式,分别为Apache的BeanUtils和PropertyUtils,Spring的BeanUtils,Cglib的BeanCopier.做法是在Eclipse新建了一

关于Spring中BeanUtils的一次使用问题记录

1.问题描述:今天在进行前后端联调的时候,发现商品图片不能正常显示: 2.排查过程:查看浏览器控制台,发现调用接口返回的数据关于图片的字段未返回数据:      然后,又跑了一下Dao层的单元测试,从数据库中拿出数据正常:     那基本确认就是代码中数据转换转丢了,打了下debug,果然如此,在BeanUtils.copyProperties(productInfo, productInfoVO)处转换的问题: 3.原因:图片字段的值未能正确的拷贝过去,是因为两个Bean的icon(图片)字段

Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)

 文章转载来自:http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html 作为一个新员工,一个首要的工作就是阅读别人的代码,阅读代码的诸多好处就不说了,我就直奔主题,通过预读代码,发现了几种实现两个不同类型的Bean之 间实现值复制的几种方式,上网查询后发现性能上会有差异,于是就萌生自己深入了解几种实现的想法.第一步就是先本着实事求是的原则去探求一下大家总结出来 的性能差异是否正确. 比较的是四种复制的方式,分别为Apache的Bea

spring BeanUtils 工具实现对象之间的copy

一般我们会开发中会遇到返回用户信息的时候,不需要返回密码或者其他参数,这时候我们需要重新定义一个VO类去除不需要的参数,将原对象copy到VO类中 使用spring的BeanUtils可以实现对象的copy 语法: BeanUtils.copyProperties(source, target); import org.springframework.beans.BeanUtils; SdbDbUser user =userServer.getUserInfo(toUser); UserVO u

Spring Data Redis学习

本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 1.新功能 1.1.Spring Data Redis 1.8 新特性 1.2.Spring Data Redis 1.7 新特性 1.3.Spring Data Redis 1.6 新特性 1.4.Spring Data Redis 1.5 新特性 介绍 2.为什么选择Spring Data Redis? 3.要

BeanUtils.copyProperties缓解代码压力,释放双手

简单描述:之前在写代码的时候,经常把表单提交到后台的对象的参数,通过getter方法取出来,然后,再通过setter方法传递给需要的对象,代码中写了很多get set这种方法,后来听同事说,spring有一个BeanUtils.copyProperties()方法,可以代替我们手动来完成取值赋值的操作.我就试了试,发现果然可以. BeanUtils.copyProperties(courseObj, courseVo);//把courseObj里的属性通过反射赋值给courseVo里相同的属性,

你还在用BeanUtils进行对象属性拷贝?

一.背景 1.1 对象拷贝概念 Java中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int.double.byte.boolean.char等简单数据类型,引用类型包括类.接口.数组等复杂类型. 对象拷贝分为浅拷贝(浅克隆)与深拷贝(深克隆). 浅拷贝与深拷贝差异 1.2 示例前准备 源对象属性类UserDO.class(以下示例,源对象都用这个) @Datapublic class UserDO { private int id; private String userName

IOC容器的初始化过程

1.ClassPathXmlApplicationContext类体系结构 左边的黄色部分是ApplicationContext体系继承结构,右边是BeanFactory结构体系,两个体系是典型的模板方法设计模式的使用. 从该继承体系可以看出: (1)BeanFactory是一个bean工厂的最基本定义,里面包含了一个bean工厂的几个最基本方法:getBean(),containsBean()等,是一个很纯粹的bean工厂,不关注资源.资源位置.事件等. ApplicationContext是

对象属性复制几种方式

对象属性复制的三种方法: 1.Apache提供的BeanUtil.copyProperties和PropertyUtil.copyProperties两种方式 BeanUtils.copyProperties("转换后的类", "要转换的类"); PropertyUtils.copyProperties("转换后的类", "要转换的类"); 口诀:后付钱(后付前:后面的复制给前面) 2.spring提供的BeanUtil.co