2011-01-04 4 views
2

たとえば、java.lang.Classインスタンスcを実行時に持っているとします。クラスによって参照されるすべてのクラスを取得します

実行時に、どのクラスがcで使用されているか確認するにはどうしますか?例えばc.fooがBをインスタンス化する場合、Bは「使用されています」。 c.fooが静的メソッドG.bar()を呼び出すと、Gが使用されています。

注:静的に知ることができるクラスを取得しようとしているだけです。リフレクションによって読み込まれたクラスはありません。 Pythonで

、同等の機能をmodulefinderに見出される:他の参照クラスは、リフレクションを使用してインスタンス化することができるので

http://docs.python.org/library/modulefinder.html
+1

を、使用[ 'getLoadedClasses()'](http://download.oracle.com/javase/6/ docs/api/java/lang/instrument/Instrumentation.html#getAllLoadedClasses%28%29) –

答えて

2

すべてが反射して照会することができます。フィールドとメソッドのシグネチャを見て、フィールドを反映させて、フィールド値の実際のクラスを取得することができます。

クラス内部メソッドは非常に難題です。 BCELまたは同様のツールを使用してクラスファイルを分析し、がクラスファイルにハードコードされたのすべてのクラス名を抽出することができます。しかし、これはインタフェースに対して、すぐにあなたがプログラムとして失敗します。

public List someMethod() { 
    return SomeClass.getList(); 
} 

someMethodによって返されたクラスの型は、クラスファイルで知られていません。ルックアップテーブルやセントラルレジストリはありません。 JVMはタイプを認識し、クラスが既にロードされているかどうかを調べ、ロードされていない場合はロードしようとします。それはについて気にする必要はありません。クラスは他のクラスを要求しており、この情報は記録されません。 exectutionのために必要ではなく、ガベージコレクションのために必要ではないからです。

2

私見、それは不可能です。あるいは、依存性注入メカニズムを使用して注入することもできます。いくつかのクラスを動的にロードすることができる

+0

良い点。リフレクションで参照されるクラスを無視することに再分類されました。 – UsAaR33

1

、使用方法本体、コンストラクタと静的initilizersの外部起こるgetLoadedClasses()

+0

便利ですが、制約のある条件でのみ実行できます。すなわち私のmain()では、私はCを生成し、それ以外は存在しません。 – UsAaR33

+0

うーん、とにかくコマンドラインで-agentを使わずにこれを行うには? – UsAaR33

1

これは試すことができますJava Dependency Resolver projectプロジェクト内の特定のクラスに対して参照されているクラスとjarだけでなく、

0

Maven Dependency Analyzerを見て、そのクラスASMDependencyAnalyzerください:いくつかのクラスを動的にロードすることができ

Set<String> referencedClasses = new ASMDependencyAnalyzer().analyze(new File("ClassName.class").toURI().toURL()) 
関連する問題