2011-11-19 79 views
0

所以我有一個相當複雜的applet結構從幾年前,我有一個關於它的全局類的問題。基本上,我在同一頁面上有三個小程序,他們以不同的方式彼此交互。我感到困惑的部分是,它們都共享來自同一類的全局(靜態)變量。這究竟發生了什麼?我的印象是,每個applet都有自己的小環境,因此無法訪問其他靜態變量。例如,如果我有這個小程序中的一個:爲什麼多個applet可以訪問一個全局類?

Globals.globalVar = 5; 

這在小程序B:

int x = Globals.globalVar; 

而且我保證B啓動後A,則x將成爲5.我想知道如何這正是在JVM中處理的,因爲它對我來說沒有任何意義。這種行爲意味着如果你有兩個獨立的Java應用程序同時運行,他們可以訪問其他靜態變量嗎?事先感謝。

回答

4

因爲這就是它的定義,所以出於向後兼容的原因。見http://download.oracle.com/javase/6/docs/technotes/guides/jweb/applet/applet_execution.html#cache

通常情況下,如果兩個小程序具有相同的代碼庫和歸檔 參數,它們會由同一個類加載器實例來加載。 此行爲是向後兼容性所必需的,並且依賴於多個真實應用程序的 。結果是,同一網頁上的多個小應用程序可以在Java語言級別訪問彼此的靜態變量 ,從而有效地允許多個小應用程序被寫入,就好像它們包括單個應用程序一樣。

雖然此功能可以方便地將某些類型的應用程序編寫爲 ,但它有一定的缺點。它會干擾 終止小程序,特別是當同一小程序的多個實例處於活動狀態時。它使小應用程序 的編程模型更加複雜,因爲它正好在小應用程序的靜態 字段將被重新初始化並且它們將從運行保持到運行相同小應用程序的時候被指定爲 。由於無法準確識別哪個小應用程序發起了特定請求,因此它會導致Java Plug-in 中某些用戶界面操作的不精確 行爲。

由於這個原因,新的Java插件提供了一種方法,可以根據小應用程序選擇退出 對小應用程序的類加載器緩存的使用。

+0

非常有趣,謝謝! – SuperTron

相關問題