BeanUtils中copyProperties的使用

本文详细介绍了如何使用BeanUtils的copyProperties方法进行对象间属性的复制,包括默认复制及忽略指定属性的情况。

BeanUtils中copyProperties的作用是将一个对象中的属性值赋值(拷贝)给另一个对象中对应的属性,并且对象之间可以没有任何联系。其中赋值成功的属性对应的属性名和属性类型必须相同,否则对应的属性值不会从一个对象赋值给另一个对象,但是此时不影响其他属性值的拷贝。具体如下所示。

1、实体类

public class Model01 {
    private String name;
    private int age;
    private String city;

    @Override
    public String toString() {
        return "Model01{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", city='" + city + '\'' +
                '}';
    }
}
public class Model02 {
    private String name;
    private String age;
    private String city;

    @Override
    public String toString() {
        return "Model02{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}


2、将符合条件的属性值全部从一个对象赋值给另一个对象——copyProperties(Object source, Object target)

public class App {
    public static void main( String[] args ) {
        Model01 model01 = new Model01();
        Model02 model02 = new Model02();
        model01.setName("jack66");
        model01.setAge(12);
        model01.setCity("gz");
        model02.setName("henry");
        model02.setAge("32");
        model02.setCity("sz");
        BeanUtils.copyProperties(model01,model02);
        System.out.println(model01);
        System.out.println(model02);
    }
}
打印结果

Model01{name='jack66', age=12, city='gz'}
Model02{name='jack66', age='32', city='gz'}

3、忽略某些属性的赋值——copyProperties(Object source, Object target, String... ignoreProperties)

public class App {
    public static void main( String[] args ) {
        Model01 model01 = new Model01();
        Model02 model02 = new Model02();
        model01.setName("jack66");
        model01.setAge(12);
        model01.setCity("gz");
        model02.setName("henry");
        model02.setAge("32");
        model02.setCity("sz");
        String[] ignoreProperties = {"name"};
        BeanUtils.copyProperties(model01,model02,ignoreProperties);
        System.out.println(model01);
        System.out.println(model02);
    }
}
打印结果

Model01{name='jack66', age=12, city='gz'}
Model02{name='henry', age='32', city='gz'}

### BeanUtils.copyProperties 方法的使用说明 `BeanUtils.copyProperties` 是 Apache Commons BeanUtils 提供的一种工具方法,用于将一个 Java 对象中的属性值拷贝到另一个具有相同属性的对象中。该方法通过反射机制调用源对象和目标对象的 getter 和 setter 方法完成属性赋值。 #### 使用条件 为了成功执行 `BeanUtils.copyProperties` 方法,需满足以下条件: - 源对象和目标对象的属性名称及其类型必须匹配。 - 属性对应的 getter 和 setter 方法必须存在并遵循 JavaBeans 规范[^3]。 #### 示例代码 以下是基于引用内容构建的一个典型示例: ```java import org.apache.commons.beanutils.BeanUtils; import com.alibaba.fastjson.JSON; public class Test { public static void main(String[] args) throws Exception { // 创建源对象 Human Human human = new Human(); human.setName("张三"); // 设置复杂的嵌套属性 Legs List<Leg> legs = new ArrayList<>(); Leg leg = new Leg(); leg.setLength(1); leg.setNum(2); legs.add(leg); human.setLegs(legs); // 创建目标对象 Animal Animal animal = new Animal(); // 执行 copyProperties 方法 BeanUtils.copyProperties(animal, human); // 输出结果 System.out.println(JSON.toJSONString(animal)); // 获取嵌套属性验证 Claw claw = animal.getLegs().get(0); } } // 定义 Human 类 class Human { private String name; private List<Leg> legs; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Leg> getLegs() { return legs; } public void setLegs(List<Leg> legs) { this.legs = legs; } } // 定义 Animal 类 class Animal { private String name; private List<Claw> legs; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Claw> getLegs() { return legs; } public void setLegs(List<Claw> legs) { this.legs = legs; } } // 定义 Leg 类 (Human 中使用的) class Leg { private int length; private int num; public int getLength() { return length; } public void setLength(int length) { this.length = length; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } } // 定义 Claw 类 (Animal 中使用的) class Claw extends Leg {} ``` 上述代码展示了如何利用 `BeanUtils.copyProperties` 将复杂对象之间的属性进行复制,并处理嵌套结构的情况[^4]。 --- #### 注意事项 尽管 `BeanUtils.copyProperties` 功能强大,但在实际应用中有许多需要注意的地方: 1. **getter 和 setter 方法的存在性**:如果某个字段缺少相应的 getter 或者 setter 方法,则会抛出 `NoSuchMethodException` 异常。 2. **浅拷贝行为**:对于包含引用类型的字段(如列表、集合),`copyProperties` 只会创建指向同一内存地址的新引用,而不会深拷贝这些对象的内容[^5]。 3. **数据一致性风险**:当两个对象之间共享某些可变状态时,可能会引发意外的行为或错误。 为了避免这些问题的发生,可以考虑采用其他替代方案,比如手动编写逻辑或者借助第三方库实现更安全可靠的深层克隆功能[^2]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ability Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值