Java 如何覆盖大型第三方API的一小部分?

Java 如何覆盖大型第三方API的一小部分?,java,Java,我们使用的是一个商业分布式缓存框架。我们需要为企业内的其他商店提供使用此框架的能力,但我们需要保持对缓存名称的控制。框架将很乐意创建/获取具有任何请求名称的缓存实例,但我们希望避免两个不同的应用程序团队无意中使用相同的缓存名称,并最终引用相同的缓存 理想情况下,我们应该有一个管理员网站,用户可以在其中保留缓存名称,然后缓存创建过程将检查该网站后面的数据库,以确保请求的缓存名称是他们保留的名称 如果不使用我们自己的包装器包装整个第三方API,有没有办法做到这一点 我们可以对CacheManager

我们使用的是一个商业分布式缓存框架。我们需要为企业内的其他商店提供使用此框架的能力,但我们需要保持对缓存名称的控制。框架将很乐意创建/获取具有任何请求名称的缓存实例,但我们希望避免两个不同的应用程序团队无意中使用相同的缓存名称,并最终引用相同的缓存

理想情况下,我们应该有一个管理员网站,用户可以在其中保留缓存名称,然后缓存创建过程将检查该网站后面的数据库,以确保请求的缓存名称是他们保留的名称

如果不使用我们自己的包装器包装整个第三方API,有没有办法做到这一点


我们可以对CacheManager进行子类化,覆盖创建方法,并指示他们使用我们的子类而不是原始类,但是什么能阻止他们只使用原始类呢?

使用工厂方法创建自己的库,该方法创建正确命名的缓存并返回它。从那时起,库的用户就可以像平常一样访问商业分布式缓存框架,而不必经过任何子类或其他复杂的操作

你的图书馆: 访问服务器以检索缓存名称->创建缓存->将缓存交还给用户


然后,用户通过返回的缓存直接与第三方库交互。

一种方法是更改API源代码,使类和方法不可见,并提供自己的接口。如果它是开源的,就不应该是问题。如果购买,供应商应该能够帮助您


第二种方法可能是在运行时失败,若直接尝试加载任何API类,而不是通过重写类。这可以通过创建自定义引导类加载器来实现,该加载器将成为所有类加载请求的单一入口点。

这是显而易见的解决方案,但为了使用返回的缓存,最终用户需要有第三方jar。是什么阻止他们绕过我们提供的工厂?简单的答案是——什么都没有。我认为,既然问题是“在你的企业内”,你可以通过政策来实施这一点。