Почему несколько апплетов могут обращаться к одному глобальному классу? - PullRequest
0 голосов
/ 19 ноября 2011

Итак, у меня есть довольно сложная структура апплета пару лет назад, и у меня есть вопрос о глобальном классе, который в нем. По сути, у меня есть три апплета на одной странице, и они взаимодействуют друг с другом по-разному. Я запутался в том, что все они используют глобальные (статические) переменные из одного класса. Как именно это происходит? У меня сложилось впечатление, что у каждого апплета будет свое собственное маленькое окружение, и поэтому он не сможет получить доступ к тем же статическим переменным, что и другие? Например, если у меня есть это в апплете A:

Globals.globalVar = 5;

И это в апплете B:

int x = Globals.globalVar;

И я гарантирую, что B начнет ПОСЛЕ A, а затем x станет 5. Я хотел бы знать, как именно это обрабатывается в JVM, поскольку это не имеет никакого смысла для меня. Означает ли это, что если у вас одновременно работают два отдельных java-приложения, они могут обращаться к статическим переменным друг друга? Заранее спасибо.

1 Ответ

4 голосов
/ 19 ноября 2011

Потому что так это определено по причинам обратной совместимости. Смотри http://download.oracle.com/javase/6/docs/technotes/guides/jweb/applet/applet_execution.html#cache:

Обычно, если два апплета имеют одинаковую кодовую базу и архив параметры, они будут загружены одним и тем же экземпляром загрузчика классов. Это поведение требуется для обратной совместимости и основано на несколькими реальными приложениями. Результатом является то, что несколько апплеты на одной веб-странице могут получать доступ к статическим переменным друг друга на уровне языка Java, эффективно позволяя несколько апплетов быть написанным так, как если бы они составляли одно приложение.

Хотя эта функция позволяет определенным типам приложений удобно написано, у него есть определенные недостатки. Это мешает прекращение апплетов, в частности, когда несколько экземпляров один и тот же апплет активен. Это делает модель программирования для апплетов более сложный, так как он точно указан при статическом поля апплета будут переинициализированы, и когда они будут поддерживается от запуска к запуску одного и того же апплета. Это вызывает неточность поведение определенных операций пользовательского интерфейса в Плагине Java из-за невозможности точно определить, какой апплет инициировал конкретный запрос.

По этой причине новый плагин Java предоставляет возможность отказаться от использование кэша загрузчика классов для каждого апплета.

...