我遇到了一种情况,在这种情况下,我想知道/获取对在其上调用了某种方法的对象的引用。
基本上,我正在尝试编写一个xposed模块。该模块的功能之一是找出应用程序通过HTTP命中的所有URL。为此,我的方法是:
我假设任何应用程序(或至少有问题的应用程序)都将调用openConnection()建立HTTP连接。因此,请在应用程序运行时挂接openConnection()方法,并尝试找出调用该方法的对象。检索完对象后,找出在对象实例化时传递给它的字符串。此字符串对象将是应用程序要建立HTTP连接的URL。
现在,我希望是否有一种Java反射可以帮助我实现上述目标的方法-找出对象引用,然后找到实例化对象时传递给它的字符串。
示例-来自Android世界:
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
现在,我想知道是否有一种方法可以知道'url'是调用openConnection()的对象。最终目标是,我希望能够在创建对象时获取传递给URL的字符串“ myurl”。
有办法吗?
我已经经历了这一点:如何使用stacktrace或反射找到方法的调用者?
但是,在我看来,以上内容并没有帮助。此外,在上面的评论中提到即使我使用StackTraceElement,也不会获得对象的名称/引用。我只会得到调用者的类型。而且,仅凭被调用者,我认为我将无法实现找到“ url”字符串的最终目标。可以吗
使用thisObject应该是方法。
作为一个额外的想法,也许考虑使用静态可访问的WeakIdentityHashMap,以便您可以将url对象(param.thisObject)存储为键,并将url字符串存储为值。
过程:1)拦截URL的构造函数以将其注册在Map中2)打开连接以获取其值时检索它。
为什么要使用WeakIdentityHashMap?IdentityHashMap执行引用相等代替对象相等。WeakIdentityHashMap保留对对象的弱引用,这意味着,如果原始应用程序不再引用对象,则仍可以对其进行垃圾回收。
我在一些Xposed项目中一直在使用它。
PS-如果需要线程安全,则将其与Collections.synchronizedMap一起包装
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句