0

実行時に使用されるすべてのクラスをコピーしてロードする RemoteClassLoader を実装しようとしています。まず、使用されているクラスを収集する必要があります。解決策を見つけました。

特定の API のどのクラスが使用されているかを調べる

クラスをロードし、宣言されたすべてのフィールドとメソッドを反復し、すべての型を収集するのと同じように、「目に見える」クラスの使用法のみを収集します。静的メソッドのみを含むクラスがあり、このメソッドのインスタンスは使用されないため、関数に与えられないか、フィールドになるため、そのクラスが表示されません。

当然、バイトコード ファイルにはこのクラスの名前が含まれています。

strings TestClass.class | grep -i "json"

gives: org/json/JSONObject

はい、そのクラスは私が検索し、好きではありません。どうすれば見つけられますか?そして、私が関数でのみ使用する他のもの。

4

1 に答える 1

0

保守的な方法ではありますが、最も簡単な方法は、単純にClass_info定数プールからすべてのエントリを取得することです。メソッドを呼び出したり、クラスのフィールドにアクセスしたりするには、そのクラスの定数プール エントリが必要です (リフレクションはカウントせず、サブクラスのオーバーライド メソッドはカウントしません)。

クラスファイルを解析してこれにアクセスできるようにするツールは数多くあります。もちろん、熟考ははるかに難しく、一般的には決定できません。

編集:これには、単なるUtf8_infos である型記述子は含まれません。型としても使用されているクラスを見つけたい場合は、2 つの方法があります。すべての Utf8 を調べて記述子のように見えるものをすべて含めるか (まれに誤検知が発生する可能性があります)、クラスファイルを調べてすべての型記述子の参照を見つけることができます。

于 2014-03-05T14:54:45.993 に答える