2011-09-05 10 views
6

コードベースが巨大で、いくつかのクラスはしばしばコード全体に反映されて使用されます。Java:リフレクションコードの使用状況を確認

は、Javaコードのためのいくつかの反射エクスプローラがあります...私は、文字列を検索するよりも、そうでない場合は、それらを見つけることができない私たちは安全クラスを削除することができますし、コンパイラは幸せですが、そのうちのいくつかは、リフレクションを使用して動的に使用されていますか?

+0

クラスは動的に使用されているか、彼らは文字列としてフルネームを使用してロードされているかだスクリプトで使用されています実行時に評価する? –

+0

フルネームは文字列 – Xorty

+0

可能な限り避けてください。 Javaのようなタイプセーフな言語が非常に強力でエンタープライズシステムで使用されている理由は、コンパイル時の型チェックがコンパイル時に大部分の型の競合を見つけることができるということです - 特定のことを行うためにリフレクションを使用する場合を除いて - そしてすべてのベットはオフで、あなたのコードが「鉱山」で埋め込まれているプログラミングの暗黒時代は、ユーザーの一人がテストのために考えなかった方法でコードを実行したときにいつでも消えることがあります。 – Volksman

答えて

3

あなたのJREにライセンスされたソースを使用して、リフレクションによってクラスが使用されるときにリフレクションクラスを変更することをお勧めします(重複を無視するためにマップ/ WeakHashMapを使用してください)。修正されたシステムクラスは、rt.jarのものをコマンドラインの-Xbootclasspath/p:に置き換えることができます(Oracleの "Sun" JREでは、他のものはおそらく同様のものがあります)。プログラムとテストを実行し、何が起きているかを確認します。

(おそらくあなたはシステムクラスでクラスのロード順の問題を周りにハックする必要がある場合があります。)

+0

しかし、これはプログラムの特定の実行でロードされたものだけを見つけるでしょう。私が提案したのは、静的に同じことをすることでした。クラスを修正するという苦労を経る必要はありません。あなたのコメントに興味があります。ありがとう。 –

+1

@Hemal種類はどの反射が使用されているかによって異なります。リフレクションのより有用な使用法は、文字列をハードコード化しません。文字列がハードコードされている場合は、 'java.lang.reflect'のためのgreppingを提案し、リフレクションを削除します。 –

4

これを行う簡単なツールはありません。ただし、代わりにコードカバレッジを使用できます。これは、実行されたすべてのコード行を報告します。これは、テストコードの改善またはデッドコードの削除のどちらかでさらに役立ちます。

反射は定義によって非常に動的であり、あなたはそれがどうなるか見て右のコードを実行する必要があります。つまり、合理的なテストが必要です。あなたは、私がそのようなユーティリティが容易に利用可能であるが、私は間違っている可能性を疑うあなたがこのコードにアクセスできる場合は反射がない、または多分あなたはこれらのライブラリの計測器を使用することができます(またはそれらを直接変更する)すべてに

0

をロギングを追加することができます。

これは(リフレクション経由)、動的にロードされるクラスは、それ自体が動的に他のクラスをロードし、ロードされたクラスの名前は、変数または一部の実行時の入力から来ることができることを考えると、非常に複雑です。

あなたのコードベースはおそらくこれらのどちらもしません。これが一度の努力であれば、文字列を検索することは良い選択肢かもしれません。あるいは、リフレクションメソッドへの呼び出しを探します。

0

他のポスターにも触れているように、これはReflectionの動的な性質のため静的解析ではできません。 Eclipseを使用している場合は、このカバレッジ・ツールが有用であることがわかります。作業が非常に簡単です。 EclEmma

関連する問題