Java 如何修改第三方代码

Java 如何修改第三方代码,java,Java,一个假定简单的建筑/设计问题: 我们的Java应用程序依赖于第三方代码。但是,这个第三方代码做了一件我不喜欢的事情(将时区设置为GMT;我想根据应用程序的TimeZoneID设置不同的时区)。我有什么选择 1-我不能简单地扩展第三方类并覆盖不需要的行为,因为在我们的应用程序中到处都有第三方类的调用方(这是我们从一开始就继承了应用程序的方式) 2-也许过于侵入性的解决方案是编写我们自己的第三方代码,并依赖于它。但是,这可能太过分了,太有侵略性了 3-我看了一点SpringAOP(和aspectJ)

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

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

1-我不能简单地扩展第三方类并覆盖不需要的行为,因为在我们的应用程序中到处都有第三方类的调用方(这是我们从一开始就继承了应用程序的方式)

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

3-我看了一点SpringAOP(和aspectJ)的东西来做加载时编织。我并没有过多地涉入其中,但在我看来,由于第三方代码调用java.util.Timezone.setDefault(GMTTimeZone);(与调用我们自己编写/管理的类不同)这不是那么容易做到的。这里我可能错了,也许我仍然可以绕java.util.Timezone.setDefault()转。请让我知道这是不是真的,这几乎是我(唯一)的解决方案


4-我是否遗漏了什么,或者这几乎是所有可用的选项?

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

此外,您可以使用子类作为代理,仅用于代码中。您项目中的其他人不必使用您的子类。您可以清除不希望出现的行为,并将更改从代码中抽象出来。当要求供应商更改行为时,您也可以将此代码发送给供应商


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

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

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

ThirdPartyClassName obj=new YourSubClassName();

    obj.yourOverridenMethod()

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

您必须检查第三方的许可证,看看是否可以编写自己的等效代码。5-向他们询问源代码(或尝试反编译),并更改所需内容。不过,这涉及到对现有代码的大量测试。如果您觉得我们的答案有帮助,请接受它们。:)大多数第三方库都知道不同的用例,它们要么建议解决方案,要么考虑修复。