Java利用反射将list里的值赋到vo实体类里

本文深入探讨Java反射机制中getDeclaredFields(), setAccessible()和Field.set()方法的使用,通过实例展示了如何利用反射将List集合数据转换为对象属性值,特别强调了对private字段的访问。

首先贴上代码

    private static GxbVO PushVo(List<String> listnr){
        GxbVO vo=new GxbVO();
        Field[] declaredFields = GxbVO.class.getDeclaredFields();
        for(int a=0;a<listnr.size();a++){
            try {
                //list取值赋到vo里 但第一个字段序列化id不需要赋值
                declaredFields[a+1].setAccessible(true);
                declaredFields[a+1].set(vo,listnr.get(a));
            } catch (IllegalAccessException e) {
                 e.printStackTrace();
             }
        }
         return vo;
    }

1、 getDeclaredFields():该方法获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
当循环未执行时,通过打断点可以看到getDeclaredFields()方法所获取到的字段。
在这里插入图片描述
2、setAccessible(true) 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。访问private变量 必须为true。
当循环一次时可以看到vo里已经有一个字段有值了
在这里插入图片描述
3、循环执行完成时。在这里插入图片描述

### Java 中将泛型列表转换为 DTO 和 VO 的最佳实践 在 Java 开发中,通常会遇到需要将 `List<T>` 转换为特定的数据传输对象 (DTO) 或对象 (VO) 的场景。这种需求常见于分层架构中的数据传递以及接口设计。 #### 使用 Map 方法实现转换 通过流操作可以轻松完成从原始实体到目标 DTO/VO 对象的映射。以下是基于 Lambda 表达式的解决方案: ```java import java.util.List; import java.util.stream.Collectors; public class ConverterExample { public static void main(String[] args) { List<SourceEntity> sourceEntities = getSourceData(); // 假设这是源数据 // 将 SourceEntity 映射为目标 DTO 类型 List<DestinationDto> destinationDtos = sourceEntities.stream() .map(entity -> new DestinationDto( entity.getId(), entity.getName())) .collect(Collectors.toList()); System.out.println(destinationDtos); } private static List<SourceEntity> getSourceData() { // 返回模拟数据... return null; } } class SourceEntity { private int id; private String name; // Getters and Setters... public int getId() { return this.id; } public String getName() { return this.name; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } } class DestinationDto { private int id; private String name; public DestinationDto(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "DestinationDto{id=" + id + ", name='" + name + "'}"; } } ``` 上述代码展示了如何利用 Stream API 实现简单的属性复制逻辑[^2]。 #### 利用第三方库简化复杂映射 对于更复杂的业务场景或者字段较多的情况,手动编写映射函数可能显得冗余且容易出错。此时可借助一些成熟的开源工具来提升效率,比如 **MapStruct** 或者 **ModelMapper**。 ##### 使用 MapStruct 自动生成 Mapper MapStruct 是一种注解处理器,能够自动生成高效的类型转换器类而无需额外依赖运行时反射机制。 1. 添加 Maven 依赖项: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.3.Final</version> </dependency> <!-- 如果使用 Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency> ``` 2. 定义 Mapper 接口: ```java @Mapper(componentModel = "spring") // Spring Bean 集成支持 public interface EntityToDtoMapper { EntityToDtoMapper INSTANCE = Mappers.getMapper(EntityToDtoMapper.class); DestinationDto sourceToDestination(SourceEntity source); default List<DestinationDto> sourcesToList(List<SourceEntity> sources) { return sources.stream().map(this::sourceToDestination).toList(); } } ``` 调用方式如下所示: ```java // 获取实例并执行批量转换 List<DestinationDto> dtos = EntityToDtoMapper.INSTANCE.sourcesToList(sourceEntities); ``` 此方法不仅减少了重复劳动还提高了性能表现[^3]。 #### 关键注意事项 - 当处理不可变集合(Immutable Collections)时需特别小心修改行为[^1]。 - 确保所有必要的字段都已正确初始化以避免 NullPointerException 异常发生。 - 在大规模项目推荐采用自动化工具减少人为错误风险的同时也便于维护更新。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值