2012-05-23 50 views
4

我在靜態字段遇到問題。我認爲根本原因必須是靜態字段的範圍。靜態字段的範圍是什麼?

該項目基於Apache servicemix並由許多子項目組成。

在子項目'A'中,我在'Registration'類中定義了一個靜態列表字段'reg',還有一些靜態方法來操作字段'add'和'getAll'。部署子項目A後,項目'A'的名稱將被添加到靜態列表中進行註冊。

問題是,當涉及到子項目'B',當部署子項目'B'時,我希望它的名稱將被添加到完全相同的靜態列表中進行註冊。但是當我調用靜態方法getAll或添加'註冊'時,似乎子項目B中的'reg'與子項目A中的'reg'完全不同。所以註冊功能不起作用。

所以我想問一個基本問題,靜態字段的範圍是什麼?它在JVM中還是其他一些東西中有效?

感謝您的幫助

回答

8

靜態的範圍是全球性的 - 其所屬的類加載器中。 JVM可以創建多個類加載器,並在每個新類加載器中加載您的類的單獨實例。

靜態數據不是每個JVM的全局數據,它們是每個類加載器的全局數據。如果具有靜態字段的類在不同的類加載器中加載,則其靜態成員在另一個類加載器中將不可見。

項目A和項目B如何部署?他們是否在同一個類加載器中?

我對servicemix並不熟悉,但我想它會在單獨的類加載器中部署單獨的應用程序,就像Java EE應用程序將在不同類加載器中部署不同版本的相同應用程序一樣,因此您可以運行應用程序1.0和應用程序1.1並排,而且它們不會互相影響。

這是設計。

如果是這樣,您需要獨立的東西來維護共享狀態。 (例如數據庫)