You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Java中如何将父类值映射到子类?

解决方案

1. 用Spring BeanUtils实现属性拷贝

Spring自带的BeanUtils.copyProperties可以自动匹配父子类的同名属性完成批量赋值,父类后续新增字段也无需修改拷贝逻辑,非常省心。

示例代码:

import org.springframework.beans.BeanUtils;

// 假设已获取Parent实例parentObj
Child childObj = new Child();
BeanUtils.copyProperties(parentObj, childObj);
// 单独设置子类专属字段
childObj.setChildField("自定义内容");

注意:如果父子类存在同名但类型不兼容的字段,该字段会被自动跳过;若需要忽略特定字段,可传入第三个参数指定忽略列表。

2. 用Apache Commons BeanUtils

和Spring版本逻辑类似,Apache的BeanUtils也提供批量属性拷贝能力,用法如下:

import org.apache.commons.beanutils.BeanUtils;

Child childObj = new Child();
try {
    // 注意参数顺序:目标对象在前,源对象在后
    BeanUtils.copyProperties(childObj, parentObj);
} catch (IllegalAccessException | InvocationTargetException e) {
    e.printStackTrace();
}
childObj.setChildField("自定义内容");

注意:该工具性能略低于Spring BeanUtils,且需要显式捕获异常。

3. 自定义反射工具类(无第三方依赖)

如果不想引入外部依赖,可以自己写反射逻辑遍历父类字段,自动赋值给子类:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ParentChildCopyUtil {
    public static void copyParentFields(Object parent, Object child) throws IllegalAccessException {
        Class<?> currentClass = parent.getClass();
        // 遍历父类所有层级的字段(直到Object类)
        while (currentClass != Object.class) {
            Field[] fields = currentClass.getDeclaredFields();
            for (Field field : fields) {
                // 跳过静态字段
                if (Modifier.isStatic(field.getModifiers())) continue;
                field.setAccessible(true);
                Object fieldValue = field.get(parent);
                // 尝试在子类中找到同名字段并赋值
                try {
                    Field childField = child.getClass().getDeclaredField(field.getName());
                    childField.setAccessible(true);
                    childField.set(child, fieldValue);
                } catch (NoSuchFieldException ignored) {
                    // 子类无对应字段,直接跳过
                }
            }
            currentClass = currentClass.getSuperclass();
        }
    }
}

// 使用示例
Child childObj = new Child();
try {
    ParentChildCopyUtil.copyParentFields(parentObj, childObj);
} catch (IllegalAccessException e) {
    e.printStackTrace();
}
childObj.setChildField("自定义内容");

这个工具类会自动处理父类新增的字段,无需后续修改代码。

4. 用MapStruct(编译期生成高效代码)

MapStruct是编译期的Bean映射工具,会生成原生Java映射代码,性能比反射类工具更高,同时支持自定义映射规则。

第一步:添加Maven依赖

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.5.Final</version>
    <scope>provided</scope>
</dependency>

第二步:定义映射接口

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface ParentToChildMapper {
    ParentToChildMapper INSTANCE = Mappers.getMapper(ParentToChildMapper.class);
    
    // 自动生成Parent到Child的映射逻辑
    Child parentToChild(Parent parent);
}

// 使用示例
Child childObj = ParentToChildMapper.INSTANCE.parentToChild(parentObj);
childObj.setChildField("自定义内容");

父类新增字段后,只需重新编译项目,MapStruct会自动更新映射代码,无需手动修改接口。


内容的提问来源于stack exchange,提问作者Susmitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:50:20