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

时间:2011-11-19 00:10:37

标签: java static applet jvm

所以我在几年前有一个相当复杂的applet结构,我对其中的全局类有疑问。基本上,我在同一页面上有三个小程序,它们以不同的方式相互交互。我很困惑的部分是它们都在同一个类中共享全局(静态)变量。究竟是怎么回事?我的印象是每个applet都有自己的小环境,因此无法访问与其他applet相同的静态变量?例如,如果我在小程序A:

中有这个
Globals.globalVar = 5;

这在applet B中:

int x = Globals.globalVar;

我确保B在A之后启动,然后x将变为5.我想知道在JVM中这是如何处理的,因为它对我来说没有任何意义。这种行为是否意味着如果您有两个单独的Java应用程序同时运行,它们可以访问彼此的静态变量?先谢谢。

1 个答案:

答案 0 :(得分:4)

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

  

通常,如果两个applet具有相同的代码库和存档   参数,它们将由同一个类加载器实例加载。   向后兼容性需要此行为,并且依赖于此行为   通过几个真实的应用程序。结果就是多重   同一网页上的小程序可以访问彼此的静态变量   在Java语言级别,有效地允许多个applet   被写成好像它们只包含一个应用程序。

     

虽然此功能可以启用某些类型的应用程序   写得方便,有一定的弊端。它会干扰   终止applet,特别是当多个实例时   相同的小程序是活动的。它为applet创建了编程模型   更复杂,因为它在静态时指定的确切   applet的字段将被重新初始化,以及它们何时出现   从运行到同一applet的运行维护。它导致不精确   Java Plug-in中某些用户界面操作的行为   由于无法准确识别哪个applet发起了   特别要求。

     

出于这个原因,新的Java Plug-in提供了一种选择退出的方法   在applet的基础上在applet上使用类加载器缓存。