调用方法的对象 - Java反射

时间:2015-12-02 10:50:24

标签: java android reflection xposed-framework xposed

我遇到了一种情况,其中我想知道/获取对调用某个方法的对象的引用。

基本上,我正在尝试编写一个xposed模块。该模块的一个功能是找出应用程序通过HTTP命中的所有URL。为实现这一目标,我的方法是:

我认为任何应用程序(或至少是相关应用程序)都会调用openConnection()来建立HTTP连接。 因此,在app运行时期间挂钩openConnection()方法,并尝试找出调用该方法的对象。 一旦检索到对象,找出在对象实例化时传递给它的字符串。 此字符串对象将是应用程序要进行HTTP连接的URL。

现在我希望java反射有一种方法可以帮助我实现上述目的 - 找出对象引用,然后找到实例化对象时传递给它的字符串。

示例 - 来自Android世界:

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

现在我想知道是否有办法知道'url'是调用openConnection()的对象。最终目标是我希望能够在创建它的对象时获得传递给URL的字符串'myurl'。

我有办法做到这一点吗?

我已经经历过这个: How do I find the caller of a method using stacktrace or reflection?

但是,上述情况在我的案例中并未证明是非常有用的。而且,在上面有评论提到即使我使用StackTraceElement,我也不会得到对象的名称/引用。我只会得到调用者的类型。单独调用,我认为我无法实现找到'url'字符串的最终目标。我会吗?

2 个答案:

答案 0 :(得分:1)

使用thisObject应该是最佳选择。

作为一个额外的想法,也许可以考虑使用静态可访问的WeakIdentityHashMap,这样你就可以将url对象(param.thisObject)存储为键,并将url字符串作为值存储。

过程:1)拦截URL的构造函数以在Map中注册它2)在打开连接时检索它以获取其值。

为什么选择WeakIdentityHashMap? IdentityHashMap代替对象相等性执行引用相等性。 WeakIdentityHashMap保持对对象的弱引用,这意味着如果原始应用程序不再引用对象,它们仍然可以被垃圾收集。

我在一些Xposed项目中一直使用this

PS - 如果你需要线程安全

,请用Collections.synchronizedMap包装它

答案 1 :(得分:0)

确定。所以特别针对上述情况,(xposed模块),答案是xposed_dev_tutorial 本身。我也许忽略了它。

  

因此,如果使用myClock.updateClock()调用该方法,那么param.thisObject将是myClock。

所以,即使在我的情况下,使用param.thisObject我能够检索对'url'对象的引用。然后URL类有一个toString(),我用它来检索在实例化时传递给它的url字符串。

任何更好的答案仍然是受欢迎的,特别是如果有人可以指出如何使用反射来达到相同的目标(即如果它当然可以的话)。

相关问题