1.デモ
/**
* <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;
}
2. 思考が引き起こされる
fields = allFields
割り当てでフィールドの長さが不十分であることを考慮する必要があるかどうか。
答えは「必要ありません」
1.原因分析
Java では、配列は参照型であり、配列変数は配列自体の値ではなく、メモリ内の配列オブジェクトのアドレスを格納します。したがって、配列の代入を行うときは、配列の値を別の配列にコピーするのではなく、実際には配列オブジェクトへの参照を別の配列変数に代入することになります。
たとえば、2 つの配列変数a
とがありb
、どちらも同じ配列オブジェクトを参照しているとします。
int[] a = {
1, 2, 3};
int[] b = a;
ここで、変数a
と は両方ともメモリ内の配列のアドレスb
を参照します。{1, 2, 3}
したがって、 が実行されるとb = a;
、配列オブジェクトの参照は実際に にコピーされb
、同じ配列オブジェクトを指しますb
。a
このタイプの割り当ては参照割り当てと呼ばれます。
ある配列の値を別の配列にコピーする必要がある場合は、System.arraycopy()
メソッドまたは配列の copy メソッドを使用できます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()
メソッドを使用して配列をコピーする場合、配列オブジェクト自体ではなく、配列オブジェクトの値がコピーされることに注意してください。したがって、配列内の要素が参照型の場合、要素自体ではなく、要素への参照がコピーされます。参照型の要素をコピーする必要がある場合は、ディープ コピーを使用して要素自体をコピーする必要があります。