spring的BeanUtils.copyProperties(obj1, obj2);复制对象时字段类型不一致,导致赋值不上

当用spring的BeanUtils.copyProperties(obj1, obj2);对象进行复制时,因为在obj1 类型的对象中定义的属性类型不同(set方法中用的是Integer类型,get方法中返回的是int类型):  
public int getNumber() {
    return number;
  }

  public void setNumber(Integer number) {
    this.number = number;
  }
这样在使用复制方法时,就不会对这个number属性进行赋值。这里必须是:
public int getNumber() {
    return number;
  }

  public void setNumber(int number) {
    this.number = number;
  }
  这里是因为:spring在利用反射复制对象时,是以javaBean的规范来使用get/set方法进行设置值的。同时set方法的参与类型,在classLoader中,也会被计为函数名的一部分。
所有这里必须都是int类型或者都是integer类型。否则spring就不会对该属性进行复制相应的值。
第二个知识点:
应用场景:当我修改一个工程里的jar包内的一个类时(其实改动,就是把上一个知识点里的Integer类型修改成了int类型),然后到去替换服务器上对应的jar包后,重启工程会出现:NoSuchMethodError这样的错。
原因是:基本数据类型与包装类型的解包封包是由编译器提供的(这在jdk 1.5引入)。void setNumber(int a)与 void setNumber(Integer a); 对于编译器来说是不同的方法,他们的有着不同的方法签名。
这里就涉及到Java编辑器对Java方法编译的问题:在Java中,编辑器会把函数的参数列表与函数名称一起作为内存中标记函数唯一性的标识,这也是Java代码可以重载的原因。

你可能感兴趣的:(Spring开发)