2014-02-07 61 views
1

我有一個單獨的庫類,並沒有實現任何接口(所以我假設我不能使用動態代理)。但是,我需要與動態代理相同的功能。我需要劫持電話,記錄一些數據並按原樣將通話傳遞給圖書館。如何攔截Java或Android中的庫類的方法調用?

有沒有可能做到這一點,而不必使用AspectJ或Spring AOP? (我不確定如何使用這些框架,但如果沒有其他方法,我將不得不查看它)。

+0

此外,我無法訪問該庫的源代碼。這是一個黑匣子。 – sr09

+0

我不確切地知道你在做什麼,但是如果你正在嘗試這樣做,但是如果你知道你對圖書館所做的類,並且你正在傳遞數據,爲什麼不把你自己的單例作爲包裝並調用你內部類庫類的包裝? – CubanAzcuy

+0

對不起,如果我不是很清楚。我有一個應用程序可以對屬於A類的一個方法f()進行數百次調用(這是一個單例,我的代碼不能更改)。我想攔截每次調用f()並在轉發呼叫之前記錄數據。如果我做一個包裝,我需要去我的應用程序中的每個位置並更改代碼。 – sr09

回答

1

您可以使用相同的名稱和包提供您自己的相同類的實現,並嘗試首先將其放入classpath。具有這樣的類路徑的調用代碼將首先選擇攔截類,並且攔截類可以調用實際包的其他類來提供其實際功能。

最好的辦法是使用歸檔工具從庫.jar中刪除重寫的類。

0

您可以在調用f()的類中更改import語句,以便它們看到實現f()的不同類。執行類會做記錄並調用真正的f()。

仍然需要一些編輯,但不足以改變每個呼叫。

順便說一句:根據項目的規模,無論如何,如果這種需求將會持續進行,您可能會考慮製作包裝到「黑匣子」。

0

就像我在我的評論包裝中開始從外部庫實現的所有類。然後從你自己的類中調用外部庫,這樣你可以登錄你想要的函數。如果您使用相同的函數名稱,則不必更改所調用的內容,只需更改導入即可。大多數IDE提供大衆名稱替換,所以它不應該太大,但它將是乏味的負擔。