如何在不传递ID的情况下识别运行的Java Applet上下文?

时间:2008-08-10 18:06:05

标签: java swing applet

我是开发一个非常大的Swing Java Applet的团队的一员。我们的大多数代码都是遗留的,并且有大量的单例引用。我们将它们全部捆绑到一个“应用程序上下文”单例中。我们现在需要的是创建一些方法来分离共享上下文(在当前显示的所有applet之间共享)和非共享上下文(特定于当前显示的每个applet)。

但是,我们在调用单例的每个位置都没有ID,也不想将ID传播到所有位置。什么是识别我们正在运行的applet上下文的最简单方法? (我已经尝试搞乱类加载器,线程组,线程ID ......到目前为止,我找不到任何可以让我识别调用原点的内容。)

3 个答案:

答案 0 :(得分:2)

单身人士是邪恶的,你期待什么? ;)

也许最全面的方法是将大量applet加载到不同的类加载器中(使用java.net.URLClassLoader.newInstance)。然后使用WeakHashMap将类加载器与applet相关联。如果你可以将大部分代码分成一个公共的类加载器(作为每个applet类加载器的父代)并进入普通的applet代码库,那将会更快但更多的工作。

其他黑客:

如果您有权访问任何组件,可以重复使用Component.getParent或SwingUtilities.getRoot。

如果您在每个applet实例线程中,则可以设置ThreadLocal。

从EDT中,您可以从队列中读取当前事件(java.awt.EventQueue.getCurrentEvent()),并可能从中找到一个组件。或者使用重写的dispatchEvent方法推送EventQueue。

答案 1 :(得分:0)

如果我理解正确,我的想法是为每个调用者对象或“上下文”获取不同的“单例”对象。 您可以做的一件事是创建一个线程局部全局变量,您可以在其中编写当前上下文的ID。 (这可以通过AOP完成。)然后在单例getter中,从线程本地获取上下文ID,以用作调用上下文的正确“singleton”实例的键。

关于AOP,在applet中使用它应该没有问题,因为根据你的切入点,建议是在编译时编织的,并且JAR被添加到运行时依赖项中。因此,在运行时不应保留AOP的特殊证据。

答案 2 :(得分:0)

关于threadlocal的

@Hugo:

我想到了那个解决方案。然而,通过实验,我发现了这种方法存在两个问题:

  1. 共享线程(服务器连接等)存在问题。这可以通过特别关注这些线程来解决(它们都在我的控制之下并且几乎与遗留代码隔离)。
  2. 所有小程序共享EDT线程。我没有找到一种方法来强制为每个applet创建一个新的EDT线程。这意味着EDT的threadlocal将在applet之间共享。这一个我不知道如何解决。建议?