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



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

Globals.globalVar = 5;

在applet 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缓存:

通常,如果两个applet具有相同的代码库和存档参数时,它们将由同一个类装入器实例装入。此行为是向后兼容所必需的,并且是依赖的通过几个实际应用程序。结果就是这个倍数同一网页上的小程序可以访问彼此的静态变量在Java语言级别,有效地允许多个applet就好像它们组成了一个单独的应用程序。

虽然此功能允许某些类型的应用程序写起来很方便,但它有一些缺点。它会干扰终止小程序,特别是当有多个实例相同的小程序是活动的。它为小程序建立了编程模型更复杂的是,由于它是在静态下精确指定的applet的字段将被重新初始化,以及何时初始化从运行到运行维护同一个applet。它会导致不精确Java插件中某些用户界面操作的行为由于无法准确识别哪个applet发起了特定的请求。

由于这个原因,新的Java插件提供了一种选择退出的方法基于applet的类加载器缓存的使用

最新更新