1 回答

TA貢獻1856條經驗 獲得超17個贊
ArrayList包含一個long serialVersionUID幫助序列化的字段。當您獲得該值時,它會返回一個 boxed Long。調用getDeclaredFieldsonLong返回一個包含字段的數組,該字段Long.MIN_VALUE是Long. 這就是無限循環的來源。
Long為了解決它,我會像你一樣添加特殊情況處理Integer。您還應該考慮所有其他盒裝原語,例如Float和Byte。
集合將由引用彼此鏈接的結構LinkedList或數組支持。對于鏈接結構,代碼將遍歷它們。要支持數組支持的收集,您需要確定哪些字段是數組并遍歷它們。
字段的類型,通過Field.getType獲得。數組可以通過Class.isArray來識別。不同類型的數組有不同的類型,它們不像 Java 泛型那樣是非具體化的??梢詫⒎窃贾档臄到M強制轉換Object[]為在這種情況下很有用,但它不是類型安全的。可以使用Class.getComponentType來獲取數組中對象的類型。
需要像下面這樣的東西來遞歸數組的條目。
final Class<?> fieldType = field.getType();
if (fieldType.isArray() && !fieldType.getComponentType().isPrimitive()) {
Object[] fs = (Object[]) f;
for (Object fi : fs) {
reflect(fi);
}
}
另一個問題是可能導致進一步的循環引用StackOverflowException。如果將一個列表作為其自身的成員添加,它將無限遞歸。有必要跟蹤以前訪問過的對象,而不是兩次訪問它們。理想情況下,這將使用 an IdentityHashMap,因為您關心對象的實例而不是它們的相等性。
添加回答
舉報