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

StackOverflow https://stackoverflow.com/questions/7269

  •  08-06-2019
  •  | 
  •  

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

但是,我们并没有在每个调用单例的位置都有 ID,我们也不希望将 ID 传播到所有位置。确定我们正在哪个小程序上下文中运行的最简单方法是什么?(我尝试过弄乱类加载器、线程组、线程 ID...到目前为止,我找不到任何可以让我识别呼叫来源的信息)。

有帮助吗?

解决方案

单身人士是邪恶的,你还指望什么?;)

也许最全面的方法是在不同的类加载器中加载大部分 applet(使用 java.net.URLClassLoader.newInstance)。然后使用 Wea​​kHashMap 将类加载器与小程序关联起来。如果您可以将大部分代码拆分到一个公共类加载器(作为每个小程序类加载器的父级)和普通小程序代码库中,那么速度会更快,但工作量也会更大。

其他黑客:

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

如果您处于每个小程序实例线程中,那么您可以设置一个 ThreadLocal。

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

其他提示

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

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

@Hugo关于threadlocal:

我考虑过这个解决方案。然而,通过实验我发现这种方法有两个问题:

  1. 共享线程(服务器连接等)是有问题的。不过,可以通过特别注意这些线程来解决这个问题(它们都在我的控制之下,并且几乎与遗留代码隔离)。
  2. EDT 线程在所有小程序之间共享。我未能找到一种方法来强制为每个小程序创建一个新的 EDT 线程。这意味着 EDT 的本地线程将在小程序之间共享。这个我不知道如何解决。建议?
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top