java获取类的字段有两个方法:
getFields()是获取该类的公共字段,包括父类的。
getDeclaredFields()是获取该类的所有字段,但不包括父类。
如果我想获取该类和所有父类的全部字段呢???
我们可以调用getDeclareFilds(),先拿到该类的所有字段,然后循环的取父类,然后继续调用getDeclareFilds(),这样我们就可以拿到所有的字段了。我们还可以判断下名字,然后排除掉Ojbect类的那一层,代码段如下:
// 拿到所有的字段
List<Field> fieldList = new ArrayList<>() ;
Class tempClass = yourObject.getClass();
while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")){
fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass();
}
示例代码:
先准备三个类,里面有public protected,private类型的字段,继承关系如下:
@Data
public abstract class Parent {
public String parentField;
}
@Data
public class Son extends Parent{
protected String sonField;
}
@Data
public class GrandSon extends Son{
private String grandSonField;
}
现在有一个GrandSon类的对象,我们准备获取他所有的字段:
public static void main(String[] args) throws Exception{
GrandSon grandSon = new GrandSon();
grandSon.setGrandSonField("gameloft9");
grandSon.setSonField("son");
grandSon.setParentField("parent");
getAllFields(grandSon);
}
public static void getAllFields(Object request) throws Exception{
// 拿到所有的字段
List<Field> fieldList = new ArrayList<>() ;
Class tempClass = request.getClass();
while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")) {
fieldList.addAll(Arrays.asList(tempClass .getDeclaredFields()));
tempClass = tempClass.getSuperclass(); // 拿到父类
}
// 打印出来
for(Field field:fieldList){
field.setAccessible(true); // 设置字段的可访问性
System.out.println(field.getName() + "=" + field.get(request).toString());
}
}
运行结果: