1

大規模な Java プロジェクトで使用されていない (「デッド」) メソッドを見つける方法を考えていますが、実装を導き出すには助けが必要です。

  1. AspectJ を使用して、プロジェクト パッケージ内のすべてのメソッドに「前」のアスペクトを追加します。アスペクトは、メソッドが実行されたことを単に記録 (?) します。
  2. プロジェクト パッケージ内のすべてのクラス/メソッドのリストをコンパイルします (おそらくサービス ロケーター/リフレクションを使用します)。
  3. アドバイスされたコードは、完全な回帰テストを受けます。理想的には、これをしばらく本番環境に置きたいと思います (適切にパフォーマンスの高いソリューションが見つかった場合)。
  4. 実行されたメソッド (ステップ 1) と使用可能なメソッド (ステップ 2) のリストが比較され、呼び出されなかったすべてのメソッド (つまり、デッド コード) の包括的なリストが生成されます。

ステップ 2 と 4 はオフラインで実行できるため、実際にはステップ 1 のサポートのみを求めています。

具体的には、メソッドが実行されたときにどのように記録できますか? 何らかの種類のメモリ内ストレージを試みると、すぐに OutOfMemoryErrors に遭遇することになると思います。同様に、データをデータベースやファイル システムに保存すると、呼び出しの量が原因でパフォーマンスに大きな問題が発生する可能性があります。誰かが似たようなことをしたことがありますか?アドバイス/提案をいただければ幸いです。

4

2 に答える 2

1

CoberturaEMMAなどの一般的なテスト カバレッジ ライブラリをチェックしてみてください。AspectJ ではありませんが、彼らはあなたが話していることを正確に行います。少なくとも Cobertura は、呼び出し情報をメモリ内の行に格納するのに問題はないようです。

于 2011-07-22T00:24:05.697 に答える
0

電話をかける前のアドバイスが必要です。そのアドバイスでは、呼び出されているメソッドをログに記録したいと思います。おそらく、重複しないように、呼び出されたメソッドのセットを保持したいでしょう。thisJointPointから現在のメソッドを取得できます。AspectJ コードを提供することもできますが、それは的外れだと思います。

ツールを使用してBECLまたはASMを使用してバイナリ .class ファイルを解析し、呼び出されることがわかっているメソッドから始めて、呼び出しグラフを作成する方がよいと思います。これは、JVM がガベージ コレクションを行う方法に似ています。

しかし、本当にあなたは自分自身にこれが何であるかを尋ねるべきです. パフォーマンスですか?影響がないはずだからです。.class ファイルのサイズを小さくしたい場合は、ProGuardのようなものを使用したほうがよいでしょう。それはそれと他の問題を処理し、それはすでに行われています.

そうは言っても、本当にこれを行いたい場合の最善のアプローチは、Cobertura を使用してコードを計測し、アプリケーションを実行してから、カバレッジ レポートを確認することだと思います。使用済みコードの 90% がペイントされるまで、それほど時間はかかりません。コンパイル エラーを発生させずに削除できる、呼び出されていないメソッドはデッド コードです。

于 2011-07-22T02:34:35.713 に答える