簡體   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