我想根据运行时条件动态选择不同的类实现。假设我有一个具有完全限定类名称 C 的类。我正在运行的系统可能有许多 C 类的定义,每个定义都在自己的 jar 中。我有一个运行时条件(保存在 ThreadLocal 中),它告诉应该选择哪个定义。
有人在评论中要求我澄清原始要求,因此我将尽我所能澄清要求。有多个团队编写软件来为这个系统做出贡献——就像许多独立模块中的 4000 个类一样。更重要的是,它们可以随着时间而改变。它们目前在单独的 JVM 中运行,因此类重叠没有问题。现在我们正在考虑在同一个 JVM 中运行它们,同时在同一个 JVM 上运行多个版本;使用哪个特定的实现集由 ThreadLocal 区分。所以最初的问题是如何允许一个线程一次运行一组实现,另一次运行另一个。
我有一个当前使用 OpenJDK 8 的 tomcat 应用程序。
我相信我可以编写一个自定义的 ClassLoader 来操纵类路径以根据 ThreadLocal 以不同的方式选择 C 的定义。但我担心结果会被缓存在某个地方,比如 JVM Code Cache。除非我也可以覆盖该行为,否则下次需要该类时,运行时条件可能已更改并且缓存中的版本将是错误的。
有什么办法可以做我需要做的吗?