获取类所有声明的字段,即包括public、private和proteced,以及所有父类的字段属性
程序员文章站
2022-06-05 07:57:59
...
在获取类的属性的时候,有两种方式,getFields()
和getDeclaredFields()
。这两者的区别如下:
-
getFields()
:获得某个类的所有的公共(public)的字段,包括父类中的字段。 -
getDeclaredFields()
:获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
当我们想要获取到父类的属性,那么只能自己来实现,曾经写过一个方法,用来获取类的所有声明字段,最近有同事有碰到这个问题,便又把它拿出来了,顺便分享下,其实就是一个递归逻辑
具体编码如下:
/**
* 获取类所有声明的字段,即包括public、private和proteced,以及父类的字段属性
* 静态内部类适用(不适用于非静态内部类)包括hutool 会产生this$0
* @param c
* @return
*/
public static Field[] getAllFields(Class<?> c){
Assert.notNull(c);
Field[] fields= null;
// 获取父类,判断是否为实体类
if (c.getSuperclass() != Object.class) {
fields = getAllFields(c.getSuperclass());
}
// 获取类中的所有定义字段
Field[] declaredfields = c.getDeclaredFields();
return ArrayUtils.addAll(fields, declaredfields);
}
返回的Field[] 可以对其进行操作,比如修改值等等,有可能会需要设置 field.setAccessible(true);
需要注意:在对非静态内部类获取时,会产生this$0 ,关于什么是 java中的this$0