关于java:javalangClassCastException-Z-cannot-be-cast-to-XXXXXX

问题形容:
报错 [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属性

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理