-1

特定のメソッドが呼び出されたオブジェクトへの参照を知りたい/取得したい状況に遭遇しました。

基本的に、xposed モジュールを作成しようとしています。このモジュールの機能の 1 つは、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

Ok。したがって、特に上記のケース (xposed モジュール) の場合、答えはxposed_dev_tutorial 自体にありました。見落としていたのかもしれません。

したがって、メソッドが myClock.updateClock() で呼び出された場合、param.thisObject は myClock になります。

したがって、私の場合でも、param.thisObject を使用して、「url」オブジェクトへの参照を取得できました。そして、URL クラスには toString() があり、インスタンス化時に渡される URL 文字列を取得するために使用しました。

特に誰かがリフレクションを使用して同じことを達成する方法を指摘できる場合(つまり、もちろんそれが可能である場合)、より良い答えはまだ歓迎されています。

于 2015-12-03T03:47:52.497 に答える