获取当前类及继承自父类的所有字段,包括私有字段和受保护字段

一、demo

    /**
     * <p>获取自己及继承自父类的所有字段,包括私有字段和受保护字段,可以使用反射 API 中的 getDeclaredFields() 方法来递归获取父类的字段。</p>
     *
     * @param clazz clazz
     * @return {@link Field[] }
     * @see Class<?>
     * @see Field[]
     */
    private static Field[] getAllFields(Class<?> clazz) {
    
    
        Field[] fields = clazz.getDeclaredFields();
        Class<?> parent = clazz.getSuperclass();
        if (parent != null) {
    
    
            Field[] parentFields = getAllFields(parent);
            Field[] allFields = new Field[fields.length + parentFields.length];
            System.arraycopy(fields, 0, allFields, 0, fields.length);
            System.arraycopy(parentFields, 0, allFields, fields.length, parentFields.length);
            fields = allFields;
        }
        return fields;
    }

二、引发的思考

fields = allFields的赋值是否需要考虑fields的长度不够问题。

答案是:不需要

1.原因分析

在 Java 中,数组是一种引用类型,数组变量存储的是数组对象在内存中的地址,而不是数组本身的值。因此,在进行数组赋值时,实际上是将一个数组对象的引用赋给另一个数组变量,而不是将数组的值复制到另一个数组中。

例如,假设有两个数组变量 ab,它们都引用了同一个数组对象:

int[] a = {
    
    1, 2, 3};
int[] b = a;

这里,变量 ab 都引用了数组 {1, 2, 3} 在内存中的地址。因此,当执行 b = a; 时,实际上是将数组对象的引用复制给了 b,也就是说,ba 指向同一个数组对象。这种赋值方式称为引用赋值。

如果需要将一个数组的值复制到另一个数组中,可以使用 System.arraycopy() 方法或者数组的拷贝方法 clone()。例如:

int[] a = {
    
    1, 2, 3};
int[] b = newint[3];
System.arraycopy(a, 0, b, 0, 3); // 将数组 a 的值复制到数组 b 中

或者:

int[] a = {1, 2, 3};
int[] b = a.clone(); // 使用数组的 clone() 方法复制数组 a 的值到数组 b 中

需要注意的是,使用 System.arraycopy() 方法或者 clone() 方法进行数组复制时,复制的是数组对象的值,而不是数组对象本身。因此,如果数组中的元素是引用类型,那么复制的是元素的引用,而不是元素本身。如果需要复制引用类型的元素,需要使用深拷贝来复制元素本身。

猜你喜欢

转载自blog.csdn.net/zhoqua697/article/details/130843770