首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改第三方代码

如何修改第三方代码
EN

Stack Overflow用户
提问于 2012-08-18 02:50:44
回答 3查看 2K关注 0票数 4

一个理应简单的架构/设计问题:

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

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

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

3-我研究了Spring AOP (和aspectJ)的一些东西来做加载时编织。我没有深入研究它,但在我看来,由于第三方代码调用java.util.Timezone.setDefault(GMTTimeZone);(而不是调用我们自己编写/管理的类),它不可能那么容易完成。我可能在这里错了,也许我仍然可以绕过java.util.Timezone.setDefault()。如果这是真的,请让我知道,这几乎是我唯一的解决方案。

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

EN

回答 3

Stack Overflow用户

发布于 2012-08-18 02:55:58

首先,您可以联系第三方并要求他们更改代码。这并不像你想象的那么有希望。这会惹恼你,可能还会惹恼他们的其他客户。

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-08-18 03:05:19

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

代码语言:javascript
复制
ThirdPartyClassName obj=new YourSubClassName();

    obj.yourOverridenMethod()

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-18 02:56:34

你可能在很大程度上受限于你所发布的内容。正如smcg所说,最好是派生代码(如果可能),然后简单地更改代码,然后重新编译它。在面向方面编程中,如果你可以用猴子来修补代码,那么你就可以替换在时区调用setDefault()的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12011542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档