为什么多个applet可以访问一个全局类?

问题描述:

所以我有一个相当复杂的applet结构从几年前,我有一个关于它的全局类的问题。基本上,我在同一页面上有三个小程序,他们以不同的方式彼此交互。我感到困惑的部分是,它们都共享来自同一类的全局(静态)变量。这究竟发生了什么?我的印象是,每个applet都有自己的小环境,因此无法访问其他静态变量。例如,如果我有这个小程序中的一个:为什么多个applet可以访问一个全局类?

Globals.globalVar = 5; 

这在小程序B:

int x = Globals.globalVar; 

而且我保证B启动后A,则x将成为5.我想知道如何这正是在JVM中处理的,因为它对我来说没有任何意义。这种行为意味着如果你有两个独立的Java应用程序同时运行,他们可以访问其他静态变量吗?事先感谢。

因为这就是它的定义,所以出于向后兼容的原因。见http://download.oracle.com/javase/6/docs/technotes/guides/jweb/applet/applet_execution.html#cache

通常情况下,如果两个小程序具有相同的代码库和归档 参数,它们会由同一个类加载器实例来加载。 此行为是向后兼容性所必需的,并且依赖于多个真实应用程序的 。结果是,同一网页上的多个小应用程序可以在Java语言级别访问彼此的静态变量 ,从而有效地允许多个小应用程序被写入,就好像它们包括单个应用程序一样。

虽然此功能可以方便地将某些类型的应用程序编写为 ,但它有一定的缺点。它会干扰 终止小程序,特别是当同一小程序的多个实例处于活动状态时。它使小应用程序 的编程模型更加复杂,因为它正好在小应用程序的静态 字段将被重新初始化并且它们将从运行保持到运行相同小应用程序的时候被指定为 。由于无法准确识别哪个小应用程序发起了特定请求,因此它会导致Java Plug-in 中某些用户界面操作的不精确 行为。

由于这个原因,新的Java插件提供了一种方法,可以根据小应用程序选择退出 对小应用程序的类加载器缓存的使用。

+0

非常有趣,谢谢! – SuperTron