一、几种属性拷贝方法比较

1.几种拷贝方法对比

①org.apache.commons.beanutils.BeanUtils;
②org.apache.commons.beanutils.PropertyUtils;
③org.springframework.beans.BeanUtils
对比1: PropertyUtils的copyProperties()方法几乎与BeanUtils.copyProperties()相同,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,PropertyUtils不支持这个功能,所以说BeanUtils速度会更快一些,使用更普遍一点,犯错的风险更低一点。

2.关于BeanUtils

1)Spring 中的BeanUtils与apache中的BeanUtils区别

org.apache.commons.beanutils.BeanUtils#copyProperties方法会进行类型转换,默认情况下会将Ineger、Boolean、Long等基本类型包装类为null时的值复制后转换成0或者false,有时这个可能会引起不必要的麻烦。
而org.springframework.beans.BeanUtils.copyProperties(bookDto, book);则不会!
关于import org.apache.commons.beanutils.BeanUtils的一些该注意的地方:
BeanUtils支持的转换类型如下:
java.lang.BigDecimal,java.lang.BigInteger,boolean and java.lang.Boolean
byte and java.lang.Byte, char and java.lang.Character, java.lang.Class
double and java.lang.Double, float and java.lang.Float,int and java.lang.Integer
long and java.lang.Long,short and java.lang.Short,java.lang.String
java.sql.Date,java.sql.Time, java.sql.Timestamp
这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。


来自 langqiao123 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/langqiao123/article/details/72961332?utm_source=copy

2)性能测试

原来公司里面有个技术大牛对org.apache.commons.beanutils.BeanUtils和org.springframework.beans.BeanUtils拷贝性能进行测试,spring 包BeanUtils的性能更佳。

二、.BeanUtils父类和子类同时存在相同名称属性的拷贝

1.问题

父类存在一个属性,子类extends父类又写了相同的属性,在对象属性拷贝后,属性的值存放在哪。

2.实验

1)代码准备

父类

package bean;
import lombok.Data;
@Data
public class Parent {

    private String name;
    
    private String age;
}

子类

@Data
public class Son extends Parent {
    //属性名与父类相同
    private String name;
    private Integer soz;

}

copy source类

package bean;

import lombok.Data;

@Data
public class Person {
    //属性名相同,类型相同
    private String name;
    //属性名相同,类型不同
    private Long age;

    private Integer soz;
}

测试类

package bean;


public class CopyTest {

    public static void main(String[] args) throws Exception{
        Person person = new Person();
        person.setName("person");
        person.setAge(1L);
        person.setSoz(0);

        //子类
        Son son = new Son();
        //copy
        org.springframework.beans.BeanUtils.copyProperties(person,son);
        org.apache.commons.beanutils.BeanUtils.copyProperties(son,person);
    }
}

父类和子类同时存在相同属性BeanUtils的copyProperties复制
拷贝后,son.name有值,parent.name为空。
通过查阅BeanUtils.copyProperties方法源码,发现属性是通过反射调用setter设置属性值,而子类与父类的setName方法同名,相当于子类覆盖了父类的方法,所以拷贝之后属性的值存在于子类的属性中。
这一点,可以在子类中加上下面方法验证

 public void setName(String name) {
        super.setName(name);
        this.name = name;
    }

父类和子类同时存在相同属性BeanUtils的copyProperties复制

相关文章:

  • 2021-06-15
  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
  • 2021-07-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-03
  • 2022-12-23
  • 2022-12-23
  • 2021-06-08
  • 2021-06-26
  • 2022-12-23
  • 2021-12-13
相关资源
相似解决方案