Java-Reflection反射-获取包括父类在内的所有字段

2023-05-16

前言

今天Android移动端要加个新功能,所以回归Android程序员的身份.开发的过程中,发现了之前的代码写的有很多问题,真的应该把时间抽出来重构一下了.

其中有反射的一个坑,工具类某方法反射获取传入Model的属性值.但是当我把公共属性抽出来做基类的时候,发现获取不到基类的属性值了.原因是使用了getDeclaredFields();

分析

方法功能
getFields()获取所有public字段,包括父类字段
getDeclaredFields()获取所有字段,public和protected和private,但是不包括父类字段

写个小方法验证一下下~

写两个类,里面定义三个字段,分别用public,protected,private修饰,
一个叫ParentModel,作为父类.
一个叫model,继承ParentModel

/**
 * 用作父类
 */
public class ParentModel {

    private String p_privateField;
    public String p_publicField;
    protected  String p_protectedField;
}
/**
 * 子类,继承上面定义的用作父类的ParentModel
 */
public class Model extends ParentModel{

    private String privateField;
    public String publicField;
    protected  String protectedField;

}

ok,分别使用getFields()和getDeclaredFields()获取model的字段,循环打印出来.

 Field[] fs = Model.class.getFields();
 Field[] fs1 = Model.class.getDeclaredFields();
 for (Field f:fs) {          
     Log.d("getFields","getFields---"+f.getName());
 }

 for (Field f:fs1) {           
     Log.d("getDeclaredFields","getDeclaredFields---"+f.getName());
 }

见证答案的时候到了~
getFields()的打印输出:

这里写图片描述

getDeclaredFields()的打印输出:

这里写图片描述

测试证实了我们上面的结论是对的.

我想获取子类和父类的所有Field

如果想用反射通过Model获取parentModel和Model的所有字段,怎么办?很明显上面的两个方法都是满足不了的.那怎么办?

不用怕,我们递归Model的父类去getDeclaredFields(),代码如下:

List<Field> fieldList = new ArrayList<>() ;
Class tempClass = Model.class;
while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
      fieldList.addAll(Arrays.asList(tempClass .getDeclaredFields()));
      tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
for (Field f : fieldList) {

    Log.d("getAllFields","getFields---"+f.getName());
}

这里写图片描述

可以看到我们获取了Model和ParentModel的全部字段,不仅如此,还多出来了两个字段shadow$_klass_shadow_monitor_,这个是Object中的字段.

shadow$_monitor_shadow$_klass_是Android sdk21之后Object增加的两个字段。

如果你想屏蔽Object类的影响,可以为while循环再添加一个条件:

while (tmpClass !=null && !tmpClass.getName().toLowerCase().equals("java.lang.object") )
{
      ....
}

更新说明

2017.6.27更新:

之前被网友 lucky_god88 * 指出博客反射获取的值和真实情况不符,核实之后,已经更正为正确答案,这里谢谢可爱的lucky_god88 *发现并给我指出问题,解决问题的同时自己也在成长。同时也反省自己,以后要代码多加验证,谨慎细致,认真负责。

问题:
**1.getFields() 获取到 protected 类型字段的值 **

这个原因至今没有再次重现,很奇怪,很费解

2.getFields() 和 getDeclaredFields() 方法反射获取多了一个字段$change

这个和开发工具的配置有关系,好像是因为开启了Instant run 造成的,而且Android Studio 2.2.3已经修复了,链接在这里

参考资料

Retrieving the inherited attribute names/values using Java Reflection


欢迎关注个人微信公众号「浅浅同学的开发笔记」,最新的博客,好玩的事情,都会在上面分享,期待与你共同成长。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java-Reflection反射-获取包括父类在内的所有字段 的相关文章

  • 我们可以在java中放弃已经签名的jar吗?

    I ve a jar文件具有旧签名 并希望使用新签名重新签名 是否可以 如果可能的话 怎么做 如果签名不是您拥有的 您需要先解压 jar 像这样 假设是unix 否则翻译成dos jar xvf JarName jar rm rf META
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • JAVA_HOME环境变量和Java JDK趣事

    我想让 Java 在 1 6xxx 上运行 我更改了 JAVA HOME 变量并将其指向目录 C Program Files Java jdk1 6 0 16 我重新启动 PC 我想我可以检查我的机器指向哪个版本的 Java 但它仍然指向旧
  • 方法重载。你能过度使用它吗?

    当定义多个使用不同过滤器返回相同形状的数据的方法时 什么是更好的做法 显式方法名称或重载方法 例如 如果我有一些产品并且我正在从数据库中提取 显式方式 public List
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • 从 java 类生成 xsd 的实用程序

    我想为以下类生成 xsd public class Node private String value private List
  • [TYPE] 类型的 Bean 'x' 不符合所有 BeanPostProcessors 的处理条件

    我有一个ResourceAspect class Component Aspect public class ResourceAspect Before execution public public void resourceAccess
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 如何使 JFileChooser 仅显示具有某些特定名称 Java 的文件夹

    有什么方法可以让 JFileChooser 加载时仅显示名称为 Hello 的文件夹 这是我的代码 它显示所有文件夹以及扩展名为 py 和 java 的文件 我想添加文件夹名称限制 FileNameExtensionFilter filte
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 如何在 Spring GCP 中订阅多个 Google PubSub 项目?

    我想在 Spring Boot 应用程序中订阅多个 Google Cloud PubSub 项目 阅读完相关问题后如何使用 Spring Cloud 在一个 Spring Boot 应用程序中连接 配置两个 pubsub gcp 项目 ht
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • Encog:BasicNetwork:无需预先构建数据集的在线学习

    我正在尝试使用 encog 库作为强化学习问题的函数逼近器 更准确地说 我正在尝试启动并运行多层感知器 BasicNetwork 由于我的代理将根据我选择的任何 RL 算法以某种方式探索世界 因此我无法预先构建任何 BasicNeuralD
  • Java GridBagConstraints gridx 和 gridy 不工作?

    我正在尝试使用gridx and gridy定位我的按钮的约束 但它们不起作用 如果我改变gridx and gridy变量 什么也没有发生 如果我将填充更改为GridBagConstraints to NONE 仍然不行 我在这里错过了什

随机推荐

  • 获奖公布 | 征文——从高考到程序员

    每年的这几天 xff0c 空气中总会弥漫着紧张的味道 xff0c 2017 全国统一高考如期而至 朋友圈里的各种高考热文如流水般 xff0c 不停歇地出现在眼前 xff0c 难免会勾起自己曾经的青涩时光 还记得 xff0c 考试前 xff0
  • 消息队列

    一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器 xff0c 当我们需要使用消息的时候可以取出消息供自己使用 消息队列是分布式系统中重要的组件 xff0c 使用消息队列主要是为了通过异步处理提高系统性能和削峰 降低系统耦合性
  • ubuntu开机自启动(绝对好用)

    linux服务管理有两种方式service和systemctl lib systemd system 和 etc systemd system 存放所有可用的单元文件 systemctl test service start 比如需要开机启
  • networkx教程

    创建一个图 创建一个没有节点和边的空图 import networkx as nx G 61 nx Graph 根据定义 xff0c a span class pre Graph span 是节点 xff08 顶点 xff09 的集合以及确
  • java.lang.IllegalStateException异常产生的原因及解决办法

    错误类型大致为以下几种 xff1a java lang IllegalStateException xff1a Cannot forward a response that is already committed IllegalState
  • android测试:unresolved reference AndroidJUnit4

    如上 xff0c 如果你的测试文件在上面这个目录下 将依赖改为 androidTestImplementatio开始即可
  • hexo 绑定自己的域名

    前提 xff0c 你得有一个域名 xff0c 有些域名需要备案后才能用 在域名解析添加记录 如果你用你顶点域名 xff08 如 xff1a lookk cn xff0c 就添加一条主机记录为 64 的 xff0c 如果你用www子域名 xf
  • java 把List集合转换为json

    1 servlet List转json 需要jar包 xff0c 可以到我github下载 commons beanutils 1 7 0 jar commons collections 3 2 jar commons httpclient
  • Manjaro Gnome版设置默认文件管理器(inode/directory)为Nautilus

    自从安装Visual Studio Code以后不知道为什么默认的文件管理器会被改为这个玩意 xff0c 每次像打开应用程序目录这样的操作弹出的都是VS Code xff0c 而且仅仅显示上次使用VS Code时的会话 xff0c 并不会显
  • 在linux下安装redis集群的踩坑记录

    这里是引用 这里写自定义目录标题 环境软件及说明安装集群心得最新安装的redisredis conf 中bind 属性需要重新配置的情况Can I set the above configuration还是历史数据问题redis 密码相关
  • java ExecutorService的invokeAll方法有两种用法 +价格超时计算

    exec invokeAll tasks exec invokeAll tasks timeout unit 其中tasks是任务集合 xff0c timeout是超时时间 xff0c unit是时间单位 两者都会堵塞 xff0c 必须等待
  • CSDN日报20170616 ——《从裁缝到码农》

    程序人生 从裁缝到码农 作者 xff1a 修电脑的裁缝酱 我伸出颤抖的手去抓 xff0c 发现曾经遥不可及的梦想 xff0c 经过坚持和努力之后 xff0c 真的可以抓住 我把它抓在手心 xff0c 紧紧地 点击阅读全文 机器学习 一文了解
  • Android 之调节系统的亮度和音量

    主界面的布局非常简单 xff0c 就是三个按钮 xff0c home按钮 xff0c 返回主界面 xff0c volume按钮 xff0c 弹出音量进度条 xff0c brightness按钮 xff0c 弹出亮度进度条调节 主界面 xff
  • 用R语言对网络数据进行统计分析(五)

    R语言社交网络快速入门 一 7天入门社交网络 R语言社交网络快速入门 二 7天入门社交网络 R语言社交网络快速入门 三 7天入门社交网络 R语言社交网络快速入门 四 7天入门社交网络 R语言社交网络快速入门 五 7天入门社交网络 网络图特征
  • SSH远程登录并执行命令测试

    SSH 是 Linux 下进行远程连接的基本工具 xff0c 但是如果仅仅用它来登录那可是太浪费啦 xff01 SSH 命令可是完成远程操作的神器啊 xff0c 借助它我们可以把很多的远程操作自动化掉 xff01 下面就对 SSH 的远程操
  • CentOs7.5yum安装JDK1.8详细过程

    先查看有哪些可安装的 yum list java root 64 VM 16 35 centos yum list java Loaded plugins fastestmirror langpacks Loading mirror spe
  • 你确定不了解下 Java 中反射黑魔法吗?

    前言 反射在Java 中算是黑魔法的存在了 用一句话来形容 反其道而行之 很多限制在反射面前 xff0c 就是形同虚设 例如我们设置了一个类的成员变量是 private 目的就是为了不让外部可以随意修改访问 但是呢 xff0c 使用反射就可
  • flutter- Android SDK file not found

    问题表现 执行flutter doctor 的时候 xff0c 报错Android SDK file not found xff0c 很明确的说没有配置 30 0 3 问题解决 首先去报错的SDK路径中排查是否有这个版本 发现有 xff0c
  • Flutter-安装APK失败INSTALL_PARSE_FAILED_MANIFEST_MALFORMED

    问题表现 今天一如既往的堆砌代码长城 xff0c 但是运行 flutter 项目的时候 xff0c 突然出现 APK 安装失败 xff1a 问题解决 遇到问题不要慌 xff0c 先仔细看看报错信息 xff0c 原因说的明明白白 xff0c
  • Java-Reflection反射-获取包括父类在内的所有字段

    前言 今天Android移动端要加个新功能 所以回归Android程序员的身份 开发的过程中 发现了之前的代码写的有很多问题 真的应该把时间抽出来重构一下了 其中有反射的一个坑 工具类某方法反射获取传入Model的属性值 但是当我把公共属性