Java-Reflection反射-获取包括父类在内的所有字段
来源:互联网 发布:淘宝页面导航怎么设置 编辑:程序博客网 时间:2024/05/21 19:22
一篇好文章 转载内容如下
前言
今天Android移动端要加个新功能,所以回归android程序员的身份.开发的过程中,发现了之前的代码写的有很多问题,真的应该把时间抽出来重构一下了.
其中有反射的一个坑,工具类某方法反射获取传入Model的属性值.但是当我把公共属性抽出来做基类的时候,发现获取不到基类的属性值了.原因是使用了getDeclaredFields();
分析
写个小方法验证一下下~
写两个类,里面定义三个字段,分别用public,protected,private修饰,
一个叫ParentModel,作为父类.
一个叫model,继承ParentModel
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ok,分别使用getFields()和getDeclaredFields()获取model的字段,循环打印出来.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
见证答案的时候到了~
getFields()的打印输出:
getDeclaredFields()的打印输出:
测试证实了我们上面的结论是对的.
我想获取子类和父类的所有Field
如果想用反射通过Model获取parentModel和Model的所有字段,怎么办?很明显上面的两个方法都是满足不了的.那怎么办?
不用怕,我们递归Model的父类去getDeclaredFields(),代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
可以看到我们获取了Model和ParentModel的全部字段,不仅如此,还多出来了两个字段shadow$_klass_
和shadow_monitor_
,这个是Object中的字段.
shadow$_monitor_
和shadow$_klass_
是Android sdk21之后Object增加的两个字段。
如果你想屏蔽Object类的影响,可以为while循环再添加一个条件:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
更新说明
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
- Java-Reflection反射-获取包括父类在内的所有字段
- Java-Reflection反射-获取包括父类在内的所有字段
- 反射获取类的所有属性包括父类
- 通过java反射机制,获取对象的属性和值(包括所有继承的父类)
- android 里面 如何使用gson 快速获取类的所有字段名称,包括父类的
- java中使用反射获取pojo(实体)类的所有字段值
- java中使用反射获取pojo(实体)类的所有字段值
- 使用反射获取一个类的所有方法和字段
- 反射-获取类及其父类中声明的所有字段集合
- java反射(1)获取类的所有
- Java反射代码--02.得到某类的所有字段
- 反射遍历所有属性,包括父类
- 使用.Net Reflection 反射机制 动态获取对象字段内容的示例
- Java反射获取一个类的所有get方法
- java反射获取某接口的所有实现类
- java 反射获取类中所有的属性(含父类)
- Java反射类工具获取成员的所有方法代码
- java 反射获取所有类文件
- 机器学习实战_初识决策树算法_理解其python代码(一)
- 在Intellij IDEA 关于git的一些用法
- XZ_iOS之自定义2秒钟自动消失的提示框
- 小团队服务器开发
- clob类型判断大小问题
- Java-Reflection反射-获取包括父类在内的所有字段
- android https加载WebView图片不显示问题
- Socket.Receive 无法预知字节长度的数据接收
- 高德地图设置Marker点击事件注意事项.
- 图像分析
- struts2中自定义用户session失效拦截器
- 洛谷P2707 Facer帮父亲
- ML贝叶斯分类算法
- Android——动态设置view背景颜色setBackgroundColor