如何从实现CommonDto的对象列表中获取CustId?反射获取失败怎么办?
问题解决方案
一、修正List到List的类型转换问题
Java中List<Emp>不能直接赋值给List<CommonDto>(泛型集合不支持协变),正确的做法是逐个转换集合元素:
方式1:循环逐个添加
List<Emp> empList = new ArrayList<>(); // 初始化empList... List<CommonDto> commonDtoList = new ArrayList<>(); for (Emp emp : empList) { commonDtoList.add(emp); // 合法,Emp实现了CommonDto接口 }
方式2:Stream流转换
List<CommonDto> commonDtoList = empList.stream() .map(emp -> (CommonDto) emp) .collect(Collectors.toList());
如果仅需读取集合元素,也可以用通配符声明集合:List<? extends CommonDto> commonDtoList = empList;,但这种方式无法向集合中添加非null元素。
二、正确提取CustId的方法
优先方案:通过接口定义Getter方法(推荐)
反射不是最优解,更安全高效的方式是在CommonDto接口中定义获取CustId的方法,让Emp和Student实现该方法:
// 定义CommonDto接口 public interface CommonDto { // 根据CustId实际类型调整返回值,比如String/Long String getCustId(); } // Emp类实现接口 public class Emp implements CommonDto { private String custId; @Override public String getCustId() { return this.custId; } // 其他成员、构造方法等 } // Student类实现接口 public class Student implements CommonDto { private String custId; @Override public String getCustId() { return this.custId; } // 其他成员、构造方法等 }
之后直接遍历集合调用方法即可提取:
List<String> custIds = commonDtoList.stream() .map(CommonDto::getCustId) .collect(Collectors.toList());
备选方案:使用反射获取私有字段(仅当无法修改接口/类时使用)
你之前的错误在于:
- 调用
list.getClass()获取的是集合本身的Class(比如ArrayList),而非集合元素的Class,找不到custId字段; getField()只能获取public字段,私有字段需用getDeclaredField();- 私有字段默认不可访问,需调用
setAccessible(true)开启访问权限。
正确的反射代码:
List<String> custIds = new ArrayList<>(); for (CommonDto dto : commonDtoList) { try { // 获取当前元素类的私有字段 Field custIdField = dto.getClass().getDeclaredField("custId"); // 允许访问私有字段 custIdField.setAccessible(true); // 获取字段值,根据实际类型转换 String custId = (String) custIdField.get(dto); custIds.add(custId); } catch (NoSuchFieldException | IllegalAccessException e) { // 处理异常,比如打印日志、跳过当前元素 e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者danceAyush
相关产品推荐
相关产品推荐

