BeanUtil.copyProperties的用法

BeanUtil.copyProperties 是 Hutool 工具包中的一个方法,用于将一个对象的属性值复制到另一个对象。下面是关于 BeanUtil.copyProperties 的详细用法,包括具体参数和常见使用场景。

方法签名

BeanUtil.copyProperties 提供了多个重载版本,常用的签名包括:

  1. 基本复制

    public static void copyProperties(Object source, Object target);
    
    • 参数:
      • source: 源对象。
      • target: 目标对象。
    • 描述: 将源对象的属性值复制到目标对象中。
  2. 排除属性复制

    public static void copyProperties(Object source, Object target, String... ignoreProperties);
    
    • 参数:
      • source: 源对象。
      • target: 目标对象。
      • ignoreProperties: 要排除的属性名。
    • 描述: 将源对象的属性值复制到目标对象中,但会排除指定的属性。
  3. 指定属性映射(仅在某些版本中可用):

    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; }
}

其他注意事项

  1. 属性名称和类型匹配: 目标对象和源对象的属性名称和类型应该匹配,否则可能导致属性无法正确复制。

  2. 性能: 对于大量数据或频繁复制的场景,考虑性能影响,尤其是在深度复制和对象复杂度高的情况下。

  3. 异常处理: 在实际应用中,最好对 copyProperties 进行异常处理,以确保在属性不匹配或其他问题发生时能有适当的应对措施。

  4. 但是有几点我们需要注意:
    BeanUtils.copyProperties(a, b);b中的存在的属性,a中一定要有,但是a中可以有多余的属性;a中与b中相同的属性都会被替换,不管是否有值;
    a、 b中的属性要名字相同,才能被赋值,不然的话需要手动赋值;
    Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;
    spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。

    请注意,为了使这个例子工作,你需要在项目中包含 Hutool 工具包。你可以通过 Maven 或 Gradle 将其添加到你的项目中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值