问题形容:
报错 [java.lang.ClassCastException: [Z cannot be cast to [Ljava.lang.ChangeVO in reflective toString on model class]
但代码中在强制转换前可确定要转换对象就是 ChangeVO 对象的实例
代码如下:
public static Map<String, ChangeVO> getAllFieldNotNull(SupplierChangeVO supplierChangeVO) {Map<String, ChangeVO> map = new HashMap<>();
if (supplierChangeVO == null) {return map;}
try {Field[] fields = supplierChangeVO.getClass().getDeclaredFields();
for (Field field : fields) {field.setAccessible(true);
ChangeVO changeobj = (ChangeVO)field.get(supplierChangeVO);
if (changeobj != null) {map.put(field.getName(), changeobj);
}
}
} catch (Exception e) {log.error("getAllFieldNotNull err {}", e);
}
return map;
}
问题剖析:
在反射获取对象的 field 属性列表后,没有对 field 的属性类型做判断就进行强制类型转换。因而报错
问题解决:
在转换前,先对要转化属性的类型进行判断,是须要的类型再进行转换
Object changeobj = field.get(supplierChangeVO);
if (changeobj != null && changeobj instanceof ChangeVO) {map.put(field.getName(), (ChangeVO) changeobj);
}
另外:
在对反射后获取的对象属性进行解决前须要先设置 setAccessible 属性