前言

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

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

分析

方法

功能

getFields()

获取所有public和protected字段,包括父类字段

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()的打印输出:

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

但是发现里面多了一个$change,这个是什么呢?我也不知道,暂时还没查到答案,查到了回来补上.

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

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

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

List 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中的字段.

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

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

{

....

}

参考资料:

java 所有父类字段_Java-Reflection反射-获取包括父类在内的所有字段相关推荐

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

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

  2. java 反射 参数名_JAVA 8 反射获取参数名

    前言 在JDK8之前javac编译是不会把构造器和方法的参数名编译进class中,如果需要获取参数名,可以在方法上加上注解,反射获取注解的值从而获取参数名,比如Jackson的@JsonCreator ...

  3. java定义私有变量_Java Reflection(七):私有变量和私有方法

    在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是Java反射机制可以做到这一点.使用这个功能并不困难,在进行单元测试时这个功能非常有效.本节会向你展示如何使用这个功能. 注意:这个功能只 ...

  4. java类中获取全局变量_java 通过反射获取类的全局变量、方法、构造方法

    package com.str; public class ZiFuChuan { public static String ss = "全局变量!!!!!!"; String s ...

  5. java 反射 静态成员_java 利用反射获取内部类静态成员变量的值

    待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class ...

  6. java 获得当月天数_java中 如何获取当月的天数、指定日期的月份天数详解

    代码实现如下:import java.util.Calendar; public class GetDay { public static void main(String[] args) { int ...

  7. java string出现次数_Java String方法获取字符出现次数及字符最大相同部分示例

    本文实例讲述了Java String方法获取字符出现次数及字符最大相同部分.分享给大家供大家参考,具体如下: package demo; public class Test { public stat ...

  8. java在文件里搜字段_Java 如何找出两个文本文件中有相同字段的行

    Java有什么方便的类库做文件对比吗?比如:文件Old.txt和New.txt,第一行是列名,需要取出文件中Name字段相同的内容.部分数据如下: Old.txt New.txt Name   Dep ...

  9. java读取文件 路径_Java中的获取文件的物理绝对路径,和读取文件

    获取文件的绝对路径,读取该文件 一.文件目录打印图 下面的文件目录图,是项目中文件的位置信息:下面的例子是按照这个图来演示的. . |-- java | |-- ibard | | |-- demo1 ...

最新文章

  1. 0409互联网新闻 | 微信:朋友圈广告@好友评论互动能力全量开放;视频会议软件Zoom将于4月18日在纳斯达克交易所挂牌上市...
  2. 程序集、应用程序配置及App.config和YourSoft.exe.config .
  3. 前端学习(1188):事件绑定
  4. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)
  5. jquery获得指定元素坐标的方法
  6. 第三次IT浪潮将使白领收入成倍不均-信息革命
  7. oracle的aud文件,oracle asm实例的aud文件有关问题
  8. 简单报价单模板_圣诞节祝福邮件必这样写【附件参考模板BY埃马】
  9. Qt4_实现自定义模型
  10. 《计算机网络》学习笔记 ·003【数据链路层】
  11. 百度举办区块链论坛,携手多伙伴加速区块链产业落地
  12. Android 多种跑马灯的方法
  13. ActiveX控件dsoFramer的使用(word、excel、PPT)
  14. mysql 6.2 安装教程_linux6.2安装mysql_MySQL
  15. 关闭计算机 网络设备上的445端口,winXP/win7/win10系统关闭445端口的方法(电脑勒索病毒预防)...
  16. 手机摄影:黄埔军校旧址(下)
  17. [篇二章四]_安装 Windows 11 系统
  18. Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳
  19. 信息安全等级合规测评
  20. zeppelin高可用部署

热门文章

  1. [爬虫系列(二)]爬取豆瓣读书Top250,并保存每本书
  2. 码出高效:java开发手册_Java 11手册:Java专家分享他们在Java 11方面的最佳和最差的经验
  3. Android Automotive (二)系统架构
  4. 可见性剔除_使用分层遮挡贴图进行可见性剔除(6.实现与性能表现-2.性能表现)...
  5. 电竞新时代,AGON爱攻II AG272FCX到底怎么样?
  6. 多张CAD图纸文件怎么使用CAD转换器进行版本间的转换?
  7. Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.2 Spring Cloud Sleuth 入门
  8. python应用学习(六)——tkinter制作连连看小游戏
  9. 日本PHP的线雕产品怎么样,欧茱丽线雕安瓶怎么样?欧茱丽线雕安瓶好用吗
  10. 应用程序逆向分析 有道词典_逆向工程媒体应用程序(并使其中的所有故事免费)...