2015-12-02 116 views
-1

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

基本上,我想写一个xposed模块。该模块的功能之一是通过HTTP查找应用程序所访问的所有URL。为了达到这个目的,我的做法是:

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

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

示例 - 从Android世界:

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

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

有没有一种方法可以做到这一点?

我曾经使用过此已经走了: How do I find the caller of a method using stacktrace or reflection?

但是,上面并没有证明在我的情况非常有帮助。而且,在上面有一些评论提到,即使我使用StackTraceElement,我也不会获得对象的名称/引用。我只想得到调用者的类型。并且单独调用,我认为我不能实现寻找'url'字符串的最终目标。我会吗?

+1

其他可以调用'openConnection'的实例? –

+0

@AndyTurner我明白你的观点。但是,我想有一个对象本身的引用,所以我可以检索URL对象实例化期间传递的字符串。 – qre0ct

+0

我认为你需要澄清你的问题。我相应地删除了我的答案。 – Tunaki

回答

1

使用thisObject应该是最好的选择。

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

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

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

我在一些Xposed项目中使用this

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

0

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

所以如果方法是用myClock.updateClock()调用的,那么param.thisObject就是myClock。

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

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