2017-04-11 118 views
0

我必須修復一箇舊的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是我將有一個更好的猜測:)

非常感謝 齊格弗裏德吉普

+0

在'private static final int WRITE_OBJ_COUNTER_FIRST'中查找'JComponent'源文件。那裏的評論說它被用來處理嵌套的writeObject調用*。 –

回答

0

高興能有機會在維修地獄:-(

查找源的JComponent at constant WRITE_OBJ_COUNTER_FIRST

/**比特14-21被用來處理嵌套的writeObject呼叫**/
私有靜態最終詮釋WRITE_OBJ_COUNTER_FIRST = 14;

因此,getWriteObjCounter(JComponent)和方法以某種方式處理嵌套JComponent對象時的嵌套深度。

也看一下comment in front of these 2 methods

//這些功能必須是靜態的,使他們能夠從
//子類調用封裝內,但其繼承hierarhcy包括外
//類JComponent下的包(例如JTextArea)。

因此,重要的是這些方法都有默認包訪問,或以其他方式擺動JComponent子類的序列化不會是編譯了。

+0

啊,這似乎是合理的。嵌套的writeObject調用。沒有想到這一點。但是,這給了我兩個選擇:1.將整個事件移回到javax.swing命名空間中,我認爲這是一個極其糟糕的選擇,或者簡單地移除該方法。由於它只是寫入默認的東西,內置的writeObject()方法不僅可以處理該計數器,還可以處理一些UI委託。就在這裏,我真的不知道什麼是必要的。 – Siegfried

+0

@Siegfried所以選項1會很糟糕,選項2可能不會正確序列化嵌套對象? –

+0

這就是我所害怕的:)我們會看到的。在我可以測試之前,還有大約20多個這樣的危險需要以某種方式解決。這將花費很多時間。當我完成後,我會在這裏發佈結果。 – Siegfried