我是开发一个非常大的Swing Java Applet的团队的一员。我们的大多数代码都是遗留的,并且有大量的单例引用。我们将它们全部捆绑到一个“应用程序上下文”单例中。我们现在需要的是创建一些方法来分离共享上下文(在当前显示的所有applet之间共享)和非共享上下文(特定于当前显示的每个applet)。
但是,我们在调用单例的每个位置都没有ID,也不想将ID传播到所有位置。什么是识别我们正在运行的applet上下文的最简单方法? (我已经尝试搞乱类加载器,线程组,线程ID ......到目前为止,我找不到任何可以让我识别调用原点的内容。)
答案 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)
@Hugo:
我想到了那个解决方案。然而,通过实验,我发现了这种方法存在两个问题: