-1

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

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

我假设任何应用程序(或至少有问题的应用程序)都会调用 openConnection() 以建立 HTTP 连接。因此,在应用程序运行时挂钩 openConnection() 方法并尝试找出该方法调用的对象是什么。一旦检索到对象,找出在对象实例化时传递给它的字符串。此字符串对象将是应用程序想要建立 HTTP 连接的 URL。

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

示例 - 来自 Android 世界:

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

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

有没有办法我可以做到这一点?

我已经经历过这个: 如何使用堆栈跟踪或反射找到方法的调用者?

但是,在我的情况下,上述内容并没有多大帮助。此外,在上面有评论提到,即使我使用 StackTraceElement,我也不会得到对象的名称/引用。我只会得到调用者的类型。单独调用,我认为我无法实现找到“url”字符串的最终目标。我会吗?

4

2 回答 2

1

使用 thisObject 应该是要走的路。

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

过程: 1)截取URL的构造函数,将其注册到Map中 2)打开连接时获取它的值。

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

我一直在一些 Xposed 项目中使用它。

PS - 如果您需要线程安全,请使用 Collections.synchronizedMap 包装它

于 2015-12-15T11:51:25.940 回答
0

好的。因此,特别针对上述情况(xposed 模块),答案就在xposed_dev_tutorial 本身上。我可能忽略了它。

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

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

仍然欢迎任何更好的答案,特别是如果有人可以指出如何使用反射来实现相同的效果(也就是说,如果它当然可以)。

于 2015-12-03T03:47:52.497 回答