我遇到了一种情况,其中我想知道/获取对调用某个方法的对象的引用。
基本上,我正在尝试编写一个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'字符串的最终目标。我会吗?
答案 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字符串。
任何更好的答案仍然是受欢迎的,特别是如果有人可以指出如何使用反射来达到相同的目标(即如果它当然可以的话)。