欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

获取类所有声明的字段,即包括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