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

Java-Reflection反射-获取包括父类在内的所有字段 标签:instant span 答

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

标签:instantspan答案stringarray循环回归str类的属性

前言

今天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 !=

作者: 鲁大师

为您推荐

返回顶部