如何修改第三方代码

时间:2012-08-17 18:50:44

标签: java

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

我们的Java应用程序依赖于第三方代码。但是,这个第三方代码做了一件我不喜欢的事情(设置timeZone到GMT;我想根据应用程序的TimeZoneID设置不同的时区)。我有什么选择?

1-我不能简单地扩展第三方类并覆盖不期望的行为,因为我们的应用程序中的所有地方都有来自第三方类的调用者(这是我们继承应用程序的方式)

2-也许过于侵入性的解决方案是编写我们自己的第三方代码,并依赖于它。但是,这可能太过于过于侵入。

3-我看了一下Spring AOP(和aspectJ)的东西来做加载时间编织。我并没有太多深入,但在我看来,因为第三方代码调用了java.util.Timezone.setDefault(GMTTimeZone); (而不是调用我们自己编写/管理的类)这不容易做到。我可能在这里错了,也许我仍然可以编织java.util.Timezone.setDefault()。如果这是真的,请告诉我,这几乎是我的(唯一)解决方案。

4-我错过了什么,或者几乎所有可用的选项?

3 个答案:

答案 0 :(得分:2)

首先,您可以联系第三方并要求他们更改代码。这不像你想象的那么长。它会让你烦恼,也可能是他们的其他顾客。

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

最后,最简单的解决方案是获取返回值并将其固定在线。这是现在完成它的最快方法,但它不是一个好的模式,因为你引入的代码只用于修复其他人的问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

ThirdPartyClassName obj=new YourSubClassName();

    obj.yourOverridenMethod()

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