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

前言

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

0818b9ca8b590ca3270a3433284dd417.png

getDeclaredFields()的打印输出:

0818b9ca8b590ca3270a3433284dd417.png

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

但是发现里面多了一个$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());

}

0818b9ca8b590ca3270a3433284dd417.png

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

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

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

{

....

}

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值