繁体   English   中英

如何修改第三方代码

[英]How to modify third party code

一个简单的建筑/设计问题:

我们的Java应用程序取决于第三方代码。 但是,此第三方代码做了一些我不喜欢的事情(将timeZone设置为GMT;我想根据应用程序的TimeZoneID设置不同的时区)。 我有什么选择?

1-我不能简单地扩展第三方类并覆盖不希望的行为,因为在我们的应用程序中的任何地方都有从第三位调用第三方类的调用者(这是我们继承应用程序的方式)。

2-也许过于侵入性的解决方案是编写我们自己等效的第三方代码,然后依靠它。 但是,这可能太多而且太侵入。

3-我稍微看了一下Spring AOP(和AspectJ)的东西,以进行加载时间编织。 我并没有投入太多,但是在我看来,由于第三方代码调用了java.util.Timezone.setDefault(GMTTimeZone); (与调用我们自己编写/管理的类相反),这不容易做到。 我在这里可能是错误的,也许我仍然可以围绕java.util.Timezone.setDefault()进行编织。 请告诉我这是否正确,这几乎是我的(唯一的)解决方案。

4-我是否缺少某些东西,或者几乎所有可用的选项?

首先,您可以联系第三方并要求他们更改代码。 它不像您想象的那么长。 它使您,可能还有其他客户感到烦恼。

另外,您可以将子类仅用作代码中的代理。 项目中的其他人不一定必须使用您的子类。 您可以清理不良行为,并从代码中抽象出更改。 您也可以在要求他们更改行为时将此代码发送给供应商!

最后,最简单的解决方案是只获取返回值并内联修复。 这是现在完成它的最快方法,但是这不是遵循的好模式,因为您要引入的代码仅用于解决其他人的问题。

您可能只限于已发布的内容。 就像smcg所说,最好最好是分叉代码(如果可能的话),然后简单地更改代码,然后重新编译。 在AOP上,如果可以猴子修补代码,则可以替换在时区调用setDefault()的方法。

从您的类扩展该类并在子类中重写该方法(根据您的要求填充代码),但是该类和方法不应在该第三方代码中声明为final。

ThirdPartyClassName obj=new YourSubClassName();

    obj.yourOverridenMethod()

这将调用子类的重写方法,所有其他调用将调用第三方类的原始方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM