调用方法的对象 - Java 反射
Object on which a method was called - Java reflection
我遇到过一种情况,其中我想 know/get 对调用特定方法的对象的引用。
基本上,我正在尝试编写一个 xposed 模块。该模块的功能之一是找出应用程序通过 HTTP 命中的所有 URL。为此,我的做法是:
我假设任何应用程序(或至少是有问题的应用程序)都会调用 openConnection() 来建立 HTTP 连接。
因此,在应用程序运行时挂钩 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,我也不会得到对象的name/reference。我只会得到调用者的类型。单独使用 called,我认为我无法实现找到 'url' 字符串的最终目标。我会吗?
好的。所以特别针对上述情况,(xposed 模块),答案是 xposed_dev_tutorial
本身。也许我忽略了它。
So if the method was called with myClock.updateClock(), then param.thisObject would be myClock.
因此,即使在我的情况下,使用 param.thisObject 我也能够检索到对 'url' 对象的引用。然后 URL class 有一个 toString() ,我用它来检索在实例化时传递给它的 url 字符串。
仍然欢迎任何更好的答案,特别是如果有人可以指出如何使用反射来实现相同的目的(也就是说,如果它当然可以的话)。
使用 thisObject 应该是正确的方法。
作为一个额外的想法,也许可以考虑使用静态可访问的 WeakIdentityHashMap,这样您就可以将 url 对象(param.thisObject)存储为键,将 url 字符串存储为值。
过程: 1) 拦截URL的构造函数注册到Map中 2) 打开连接时获取其值
为什么是 WeakIdentityHashMap? IdentityHashMap 执行引用相等代替对象相等。 WeakIdentityHashMap 保留对对象的弱引用,这意味着如果对象不再被原始应用程序引用,它们仍然可以被垃圾收集。
我已经在一些 Xposed 项目中使用 this。
PS - 如果你需要线程安全
,用Collections.synchronizedMap包装它
我遇到过一种情况,其中我想 know/get 对调用特定方法的对象的引用。
基本上,我正在尝试编写一个 xposed 模块。该模块的功能之一是找出应用程序通过 HTTP 命中的所有 URL。为此,我的做法是:
我假设任何应用程序(或至少是有问题的应用程序)都会调用 openConnection() 来建立 HTTP 连接。 因此,在应用程序运行时挂钩 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,我也不会得到对象的name/reference。我只会得到调用者的类型。单独使用 called,我认为我无法实现找到 'url' 字符串的最终目标。我会吗?
好的。所以特别针对上述情况,(xposed 模块),答案是 xposed_dev_tutorial 本身。也许我忽略了它。
So if the method was called with myClock.updateClock(), then param.thisObject would be myClock.
因此,即使在我的情况下,使用 param.thisObject 我也能够检索到对 'url' 对象的引用。然后 URL class 有一个 toString() ,我用它来检索在实例化时传递给它的 url 字符串。
仍然欢迎任何更好的答案,特别是如果有人可以指出如何使用反射来实现相同的目的(也就是说,如果它当然可以的话)。
使用 thisObject 应该是正确的方法。
作为一个额外的想法,也许可以考虑使用静态可访问的 WeakIdentityHashMap,这样您就可以将 url 对象(param.thisObject)存储为键,将 url 字符串存储为值。
过程: 1) 拦截URL的构造函数注册到Map中 2) 打开连接时获取其值
为什么是 WeakIdentityHashMap? IdentityHashMap 执行引用相等代替对象相等。 WeakIdentityHashMap 保留对对象的弱引用,这意味着如果对象不再被原始应用程序引用,它们仍然可以被垃圾收集。
我已经在一些 Xposed 项目中使用 this。
PS - 如果你需要线程安全
,用Collections.synchronizedMap包装它