2015-12-02 169 views
-1

我遇到了一種情況,其中我想知道/獲取對某個方法被調用的對象的引用。調用方法的對象 - Java反射

基本上,我想寫一個xposed模塊。該模塊的功能之一是通過HTTP查找應用程序所訪問的所有URL。爲了達到這個目的,我的做法是:

我假設任何應用程序(或者至少是有問題的應用程序)都會調用openConnection()來建立HTTP連接。 因此,在應用程序運行時期間掛接openConnection()方法,並嘗試找出調用方法的對象。 一旦檢索到對象,找出在對象實例化時傳遞給它的字符串。 該字符串對象將是應用程序想要建立HTTP連接的URL。

現在我希望是否有一種方法可以幫助我實現上面的java反射 - 找出對象引用,然後在實例化對象時傳遞給它的字符串。

示例 - 從Android世界:

URL url = new URL(myurl); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

現在我想知道是否有知道「網址」是在其上的openConnection()被調用對象的方法。最終目標是我希望能夠在創建對象時獲取傳遞給URL的字符串'myurl'。

有沒有一種方法可以做到這一點?

我曾經使用過此已經走了: How do I find the caller of a method using stacktrace or reflection?

但是,上面並沒有證明在我的情況非常有幫助。而且,在上面有一些評論提到,即使我使用StackTraceElement,我也不會獲得對象的名稱/引用。我只想得到調用者的類型。並且單獨調用,我認爲我不能實現尋找'url'字符串的最終目標。我會嗎?

+1

其他可以調用'openConnection'的實例? –

+0

@AndyTurner我明白你的觀點。但是,我想有一個對象本身的引用,所以我可以檢索URL對象實例化期間傳遞的字符串。 – qre0ct

+0

我認爲你需要澄清你的問題。我相應地刪除了我的答案。 – Tunaki

回答

1

使用thisObject應該是最好的選擇。

作爲一個額外的想法,也許考慮使用靜態可訪問的WeakIdentityHashMap,以便您可以將url對象(param.thisObject)作爲鍵存儲,並將url字符串存儲爲值。

過程:1)攔截URL的構造函數以在Map中註冊它2)在打開連接以獲取其值時檢索它。

爲什麼WeakIdentityHashMap? IdentityHashMap執行引用相等來代替對象相等。 WeakIdentityHashMap保持對對象的弱引用,這意味着如果對象不再被原始應用程序引用,它們仍然可以被垃圾收集。

我在一些Xposed項目中使用this

PS - 如果您需要線程安全性,請用Collections.synchronizedMap包裝它

0

好的。因此,對於上述情況(xposed模塊)特別針對xposed_dev_tutorial 本身。我可能忽略了它。

所以如果方法是用myClock.updateClock()調用的,那麼param.thisObject就是myClock。

因此,即使在我的情況下,使用param.thisObject我能夠檢索到'url'對象的引用。然後URL類有一個toString(),我用它來檢索在實例化時傳遞給它的url字符串。

任何更好的答案仍然值得歡迎,特別是如果有人可以指出如何使用反射來實現相同的(也就是說,如果它可以在所有的過程中)。