前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >通过反射方式无法获取对象属性

通过反射方式无法获取对象属性

作者头像
编程随笔
发布2021-12-21 16:26:03
发布2021-12-21 16:26:03
3K00
代码可运行
举报
文章被收录于专栏:后端开发随笔后端开发随笔
运行总次数:0
代码可运行

问题描述

最近在一个项目上开发的接口与业务方联调时计算参数签名总是对不上,经过排查后定位到原因: 1.父类定义的属性列表,全部为public类型 2.子类中未定义新的属性,所有属性都继承自父类 3.在计算签名时传递的是子类对象,子类对象使用反射方式调用getDeclaredFields()方法无法获取到从父类继承的属性

原因追溯

通过反射方法getDeclaredFields()获取到的仅仅是在类自身中定义的属性,包括public、protected、和private属性,但不包括任何继承的属性(即使继承的属性为public类型也不能获取到)。 举例如下:

代码语言:javascript
代码运行次数:0
运行
复制
// 父类
public class ReflectBase {
    public String name;
    public int age;
    public short sex;
}

// 子类
public class ReflectImpl extends ReflectBase {
    // 在子类自身中未定义任何属性
}

ReflectImpl reflect = new ReflectImpl();
Field[] declaredFields = reflect.getClass().getDeclaredFields();
# 在子类中未定义任何属性,输出:0
System.out.println(declaredFields.length);

// 如果在子类自身中定义了属性
public class ReflectImpl extends ReflectBase {
    public String addr;
    public String birthday;
}
Field[] declaredFields = reflect.getClass().getDeclaredFields();
# 输出在子类中定义的属性:2
System.out.println(declaredFields.length);

解决办法

使用反射方法getFields()就可以获取到从父类继承的所有public属性(注意:只能获取到从父类继承的所有public属性,其他非public属性是无法获取到的)。

代码语言:javascript
代码运行次数:0
运行
复制
// 从父类获取到所有public属性,输出:3
Field[] fields = reflect.getClass().getFields();
System.out.println(fields.length);

【参考】 https://blog.csdn.net/liujun03/article/details/81512834 Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 http://devgou.com/article/Java-Reflect/ Java-反射

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 原因追溯
  • 解决办法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档