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
相关产品推荐
相关产品推荐

