一、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 中,数组是一种引用类型,数组变量存储的是数组对象在内存中的地址,而不是数组本身的值。因此,在进行数组赋值时,实际上是将一个数组对象的引用赋给另一个数组变量,而不是将数组的值复制到另一个数组中。
例如,假设有两个数组变量 a
和 b
,它们都引用了同一个数组对象:
int[] a = {
1, 2, 3};
int[] b = a;
这里,变量 a
和 b
都引用了数组 {1, 2, 3}
在内存中的地址。因此,当执行 b = a;
时,实际上是将数组对象的引用复制给了 b
,也就是说,b
和 a
指向同一个数组对象。这种赋值方式称为引用赋值。
如果需要将一个数组的值复制到另一个数组中,可以使用 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()
方法进行数组复制时,复制的是数组对象的值,而不是数组对象本身。因此,如果数组中的元素是引用类型,那么复制的是元素的引用,而不是元素本身。如果需要复制引用类型的元素,需要使用深拷贝来复制元素本身。