|
java示例演示从一个类对象复制到另一个类对象的字段赋值(字段名/类型相同或可转换)
1. 手工复制(最安全直观)
- class UserDTO {
- private Long id;
- private String name;
- private Integer age;
- // getter/setter
- }
- class UserVO {
- private Long id;
- private String name;
- private Integer age;
- // getter/setter
- }
- UserVO toVO(UserDTO dto){
- if(dto == null) return null;
- UserVO vo = new UserVO();
- vo.setId(dto.getId());
- vo.setName(dto.getName());
- vo.setAge(dto.getAge());
- return vo;
- }
复制代码 2. Spring BeanUtils
- import org.springframework.beans.BeanUtils;
- UserVO vo = new UserVO();
- BeanUtils.copyProperties(dto, vo); // 同名同类型字段复制
复制代码 忽略某些字段:
- BeanUtils.copyProperties(dto, vo, "age", "name");
复制代码 3. Apache Commons BeanUtils(会做字符串↔基本类型转换)
- import org.apache.commons.beanutils.BeanUtils;
- UserVO vo = new UserVO();
- BeanUtils.copyProperties(vo, dto); // 注意参数顺序(目标, 源)
复制代码 4. 反射通用工具(仅复制同名同类型)
- import java.lang.reflect.Field;
- public static <S,T> T copySameFields(S src, T target){
- if(src == null || target == null) return target;
- Field[] sFields = src.getClass().getDeclaredFields();
- for(Field sf : sFields){
- sf.setAccessible(true);
- try{
- Object val = sf.get(src);
- Field tf;
- try{
- tf = target.getClass().getDeclaredField(sf.getName());
- }catch (NoSuchFieldException e){ continue; }
- if(!tf.getType().isAssignableFrom(sf.getType())) continue;
- tf.setAccessible(true);
- tf.set(target, val);
- }catch (Exception ignored){}
- }
- return target;
- }
复制代码 5. MapStruct(编译期生成,高性能)
- @Mapper
- public interface UserMapper {
- UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
- UserVO toVO(UserDTO dto);
- List<UserVO> toVOList(List<UserDTO> list);
- }
复制代码 使用:
- UserVO vo = UserMapper.INSTANCE.toVO(dto);
复制代码 6. Stream 批量
- List<UserVO> list = dtoList.stream()
- .map(UserMapper.INSTANCE::toVO)
- .toList();
复制代码 7. 构造器/Builder方式
- class UserVO {
- private final Long id;
- private final String name;
- private final Integer age;
- UserVO(Long id,String name,Integer age){
- this.id=id; this.name=name; this.age=age;
- }
- static UserVO from(UserDTO d){
- return new UserVO(d.getId(), d.getName(), d.getAge());
- }
- }
复制代码 8. 记录(record)映射(JDK16+)
- record UserRecord(Long id,String name,Integer age){
- static UserRecord from(UserDTO d){
- return new UserRecord(d.getId(), d.getName(), d.getAge());
- }
- }
复制代码 选择建议- 少量/可控字段:手写或构造器
- 快速开发:Spring BeanUtils
- 高性能 + 可维护:MapStruct
- 动态不确定类型:反射工具
- 需要类型转换(String↔数值):Apache Commons BeanUtils
|
|