Java如何复制一个对象的非空值到另一个对象上

在Java中,要复制一个对象的非空值到另一个对象上,可以使用以下几种方法:

1. 手动复制

最简单的方法是手动复制对象的每个属性。这种方法比较繁琐,但逻辑清晰,能够灵活处理各种情况。

首先,需要确保目标对象已经实例化,然后逐个复制源对象的属性到目标对象。以下是一个示例代码:

public class Person {
    private String name;
    private int age;

    // 省略构造方法和Getter/Setter方法

    public void copyValuesFrom(Person source) {
        if (source.getName() != null) {
            this.setName(source.getName());
        }
        this.setAge(source.getAge());
    }
}

// 使用示例
Person source = new Person();
source.setName("John");
source.setAge(25);

Person target = new Person();
target.copyValuesFrom(source);

2. 使用BeanUtils

Apache Commons BeanUtils库提供了一个方便的方法来复制对象的属性。使用它可以减少手动复制的代码量。

首先,需要导入BeanUtils库。在Maven项目中,可以添加以下依赖项:

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

然后,可以使用BeanUtils.copyProperties()方法来复制对象的属性。以下是一个示例代码:

import org.apache.commons.beanutils.BeanUtils;

public class Person {
    private String name;
    private int age;

    // 省略构造方法和Getter/Setter方法

    public void copyValuesFrom(Person source) {
        try {
            BeanUtils.copyProperties(this, source);
        } catch (Exception e) {
            // 处理异常
        }
    }
}

// 使用示例
Person source = new Person();
source.setName("John");
source.setAge(25);

Person target = new Person();
target.copyValuesFrom(source);

3. 使用Jackson库

如果需要复制的对象是一个简单的POJO(普通Java对象),可以使用Jackson库来实现对象的复制。

首先,需要导入Jackson库。在Maven项目中,可以添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version>
</dependency>

然后,可以使用ObjectMapper类来复制对象。以下是一个示例代码:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Person {
    private String name;
    private int age;

    // 省略构造方法和Getter/Setter方法

    public void copyValuesFrom(Person source) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String sourceJson = objectMapper.writeValueAsString(source);
            Person target = objectMapper.readValue(sourceJson, Person.class);
            this.setName(target.getName());
            this.setAge(target.getAge());
        } catch (Exception e) {
            // 处理异常
        }
    }
}

// 使用示例
Person source = new Person();
source.setName("John");
source.setAge(25);

Person target = new Person();
target.copyValuesFrom(source);

以上是三种常见的方法来复制一个对象的非空值到另一个对象上。根据具体的需求,可以选择适合的方法来实现对象的复制。

类图

classDiagram
    class Person {
        - name: String
        - age: int
        + copyValuesFrom(source: Person): void
        # setName(name: String): void
        # setAge(age: int): void
        # getName(): String
        # getAge(): int
    }

状态图

stateDiagram
    [*] --> Empty
    Empty --> Copied: copyValuesFrom() called
    Copied --> [*]

以上是一个简单的状态图,表示从一个空对象开始,经过copyValuesFrom()方法后,复制了对象的非空值,最终回到空对象状态。