我必須修復一箇舊的Java項目。這堅持到Java 5.它可以用Java 8編譯,但是一些GUI組件不能正常工作。我看到的第一件事讓我非常震驚:這位[被審查]的原創開發人員已經構建了一個包含許多新類的javax.swing包,並且再次實現了許多類,這些類已經是標準庫的一部分。所以我做的第一件事就是把整個垃圾移到另一個命名空間。我使用Eclipse重構功能將整個javax.swing及其所有子包重命名爲somethingelse.swing。現在它不再編譯了。希望現在我有機會發現錯誤。Java swing組件序列化
當前的錯誤卻困在這個方法:
private void writeObject(ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
if (getUIClassID().equals(uiClassID)) {
byte count = JComponent.getWriteObjCounter(this);
JComponent.setWriteObjCounter(this, --count);
if (count == 0 && ui != null) {
ui.installUI(this);
}
}
}
類,這是一部分是一些額外樣的JComboBox的。我真的不知道什麼額外的。這並不重要。這裏的問題是:方法JComponent.getWriteObjCounter()和setWriteObjCounter()是包私有的。所以原始代碼可以訪問這些方法。移動的代碼現在沒有。由於這些是私有包,我沒有找到任何文件。所以我不知道這些是什麼,除了它是Java序列化功能的自定義序列化程序。
我明白第一行。這是標準。有趣的是,它只寫入默認值,它不會寫任何其他內容。所以我強烈懷疑整個方法是否有必要。但方法的其餘部分我不知道它應該做什麼。如果一個計數器倒數到0,它似乎會安裝UI委託。但是,那麼爲什麼要寫?爲什麼不讀書?這個櫃檯是什麼?它是如何處理的?爲了什麼目的?
在JComponent類原始的Java代碼這裏是:
static byte getWriteObjCounter(JComponent comp) {
return (byte)((comp.flags >> WRITE_OBJ_COUNTER_FIRST) & 0xFF);
}
但是,這並沒有太大的光棚要麼給它。屬性JComponent.flags不可訪問。不在javax.swing包之外。所以我再也不知道這是什麼。
如前所述,我非常懷疑這種方法有什麼意義。但是,如果有人能告訴我是出於什麼目的這writeObjCounter是我將有一個更好的猜測:)
非常感謝 齊格弗裏德吉普
在'private static final int WRITE_OBJ_COUNTER_FIRST'中查找'JComponent'源文件。那裏的評論說它被用來處理嵌套的writeObject調用*。 –