BeanUtil.copyProperties
是 Hutool 工具包中的一个方法,用于将一个对象的属性值复制到另一个对象。下面是关于 BeanUtil.copyProperties
的详细用法,包括具体参数和常见使用场景。
方法签名
BeanUtil.copyProperties
提供了多个重载版本,常用的签名包括:
-
基本复制:
public static void copyProperties(Object source, Object target);
- 参数:
source
: 源对象。target
: 目标对象。
- 描述: 将源对象的属性值复制到目标对象中。
- 参数:
-
排除属性复制:
public static void copyProperties(Object source, Object target, String... ignoreProperties);
- 参数:
source
: 源对象。target
: 目标对象。ignoreProperties
: 要排除的属性名。
- 描述: 将源对象的属性值复制到目标对象中,但会排除指定的属性。
- 参数:
-
指定属性映射(仅在某些版本中可用):
public static void copyProperties(Object source, Object target, String[] includeProperties, String[] ignoreProperties);
- 参数:
source
: 源对象。target
: 目标对象。includeProperties
: 需要复制的属性名列表。ignoreProperties
: 要排除的属性名列表。
- 描述: 只复制指定的属性,并排除不需要复制的属性。
- 参数:
示例用法
1. 基本属性复制
import cn.hutool.core.bean.BeanUtil;
public class BasicCopyExample {
public static void main(String[] args) {
// 创建源对象
SourceBean sourceBean = new SourceBean();
sourceBean.setName("Bob");
sourceBean.setAge(30);
// 创建目标对象
TargetBean targetBean = new TargetBean();
// 复制属性
BeanUtil.copyProperties(sourceBean, targetBean);
// 输出目标对象的属性
System.out.println("Name: " + targetBean.getName()); // 输出: Name: Bob
System.out.println("Age: " + targetBean.getAge()); // 输出: Age: 30
}
}
class SourceBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
class TargetBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
2. 排除属性复制
import cn.hutool.core.bean.BeanUtil;
public class ExcludePropertiesExample {
public static void main(String[] args) {
// 创建源对象
SourceBean sourceBean = new SourceBean();
sourceBean.setName("Carol");
sourceBean.setAge(28);
// 创建目标对象
TargetBean targetBean = new TargetBean();
// 复制属性,但排除 age 属性
BeanUtil.copyProperties(sourceBean, targetBean, "age");
// 输出目标对象的属性
System.out.println("Name: " + targetBean.getName()); // 输出: Name: Carol
System.out.println("Age: " + targetBean.getAge()); // 输出: Age: 0 (默认值)
}
}
class SourceBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
class TargetBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
3. 只复制指定属性(包含和排除)
import cn.hutool.core.bean.BeanUtil;
public class IncludeAndExcludePropertiesExample {
public static void main(String[] args) {
// 创建源对象
SourceBean sourceBean = new SourceBean();
sourceBean.setName("David");
sourceBean.setAge(40);
// 创建目标对象
TargetBean targetBean = new TargetBean();
// 只复制 name 属性,并排除 age 属性
BeanUtil.copyProperties(sourceBean, targetBean, new String[]{"name"}, new String[]{"age"});
// 输出目标对象的属性
System.out.println("Name: " + targetBean.getName()); // 输出: Name: David
System.out.println("Age: " + targetBean.getAge()); // 输出: Age: 0 (默认值)
}
}
class SourceBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
class TargetBean {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
其他注意事项
-
属性名称和类型匹配: 目标对象和源对象的属性名称和类型应该匹配,否则可能导致属性无法正确复制。
-
性能: 对于大量数据或频繁复制的场景,考虑性能影响,尤其是在深度复制和对象复杂度高的情况下。
-
异常处理: 在实际应用中,最好对
copyProperties
进行异常处理,以确保在属性不匹配或其他问题发生时能有适当的应对措施。 -
但是有几点我们需要注意:
BeanUtils.copyProperties(a, b);b中的存在的属性,a中一定要有,但是a中可以有多余的属性
;a中与b中相同的属性都会被替换,不管是否有值;
a、 b中的属性要名字相同
,才能被赋值,不然的话需要手动赋值;
Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法
;如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;
spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。
请注意,为了使这个例子工作,你需要在项目中包含 Hutool 工具包。你可以通过 Maven 或 Gradle 将其添加到你的项目中。