私は、私たちのライブラリのどれくらいが使用されているかを判断したいライブラリに取り組んでいます。 I.私たちは図書館のどのメソッドが公開されているのか知っていますが、呼び出されることはありません。Javaコード使用チェッカー
ゴール: 静的解析 現在のプロジェクトのパッケージAの各パブリックメソッドを呼び出すコードの行数を決定します。コールの数がゼロの場合、メソッドはそのように報告される必要があります。
私は、私たちのライブラリのどれくらいが使用されているかを判断したいライブラリに取り組んでいます。 I.私たちは図書館のどのメソッドが公開されているのか知っていますが、呼び出されることはありません。Javaコード使用チェッカー
ゴール: 静的解析 現在のプロジェクトのパッケージAの各パブリックメソッドを呼び出すコードの行数を決定します。コールの数がゼロの場合、メソッドはそのように報告される必要があります。
用PMD
とも私はあなたがこのEclipseのプラグインを探しています信じて - >UCDetector
ドキュメントから(有料予告第2の箇条書きまで)
最終できるフィールドの プライベート
ここにJavaコードカバレッジツールのリストがいくつかあります。私は個人的にこれらのいずれかを使用していないが、それはあなたが始めるかもしれません:
コードカバレッジツールの問題点は、実行時に機能するため、「まれな」コードパスを見逃す可能性があることです。 – Thilo
あなたが探しているわけではありませんまさに、しかし:同様の
何かをコードカバレッジツール(Coberturaなど)を使用して行う必要があります。ソースコードの静的検査は行いませんが、実行時にメトリックを収集するためにバイトコードを計測します。もちろん、すべての使用パターンを実行するような方法でアプリケーションを動かす必要があります。また、コードパスが稀である可能性もあります。静的解析の面では
、多分これらのツールはあなたを助けることができる(Apacheプロジェクトは、新しいリリースのためのAPIの互換性をチェックするためにそれらを使用して、そのタスクが何をしようとするとある程度関係しているように思える):
クラスや機能が必要な頻度を測定することはできません。
結論:
私はあなたが達成しようとしているのかわかりません。
コードの依存関係を表示する場合は、これを行うためのtoolsがあります。コード実行を測定しようとしている場合は、Java用にprofiler or benchmarksがあります。あなたが統計的なオタクなら、あなたはRapidMinerに満足します;)
それと幸運!
私は、JDependがパッケージとクラス間の依存関係を示し、循環依存を見つけるのに優れていることを示唆しています。 http://clarkware.com/software/JDepend.html (それはEclipseのプラグインを持っていますhttp://andrei.gmxhome.de/jdepend4eclipse/他のメトリック http://pmd.sourceforge.net/
クライアントの反射呼び出しは、静的解析で考慮する1つの穴です。特定のメソッドがいくつかの奇妙なリフレクションスキームによって呼び出されていないことを確実に知る方法がないため。したがって、ランタイムと静的解析の組み合わせが最適かもしれません。
ProGuardのは、あまりにもオプション(http://proguard.sourceforge.net/)であってもよい:
「ProGuardの一部の用途は以下のとおりです。
は、ASMバイトコード解析ライブラリ(http://asm.ow2.org)を使用して(これを読んだ後、数時間以内)もhttp://proguard.sourceforge.net/manual/examples.html#deadcode
あなたはそのための独自のユーティリティを書くことができます参照してください。 ClassVisitorとMethodVisitorを実装する必要があります。 ClassReaderを使用して、ライブラリ内のクラスファイルを解析します。
カウントを行うためにマップを維持します。キーはメソッドを表します(下記参照)。ここにいくつかのコードがあります:
class MyClassVisitor {
// ...
public void visit(int version, int access, String name, ...) {
this.className = name;
}
public MethodVisitor visitMethod(int access, String name, String desc, ...):
String key = className + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
return new MyMethodVisitor(map);
}
// ...
}
void class MyMethodVisitor {
// ...
public visitMethodInsn(int opcode, String name, String owner, String desc, ...) {
String key = owner + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
map.put(key, map.get(key) + 1);
}
// ...
}
基本的にはそれです。あなたは次のようなものでショーを始めます:
Map<String,Integer> map = new HashMap<String,Integer>();
for (File classFile : my library) {
InputStream input = new FileInputStream(classFile);
new ClassReader(input).accept(new MyClassVisitor(map), 0);
input.close();
}
for (Map.Entry<String,Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
System.out.println("Unused method: " + entry.getKey());
}
}
お楽しみください!
メソッドAがメソッドBを呼び出す場合、メソッドAが使用されていない場合でもメソッドBは「使用済み」とマークされます。したがって、これは正しくカウントする方法ではありません。あなたは "中古"の過渡的な閉鎖を取る必要があります。 –
IntelliJには、より制限された修飾子を持つメソッド、フィールド、クラスを検出するツールがあります。また、これらの変更を適用するための迅速な修正があり、多くの作業を節約できます。あなたがそれを支払うことを望まないならば、コードを変更するのに十分な時間以上の30日間の評価ライセンスを得ることができます。それは非常に頻繁に行う必要があるものではありません。
BTW:IntelliJには、コードの品質を向上させるための約650のコード検査があります。約半分は自動修正があるため、数日かけてコードをリファクタリング/整理することをお勧めします。
Dead Code Detectorをご覧ください。静的解析を使用して未使用のコードを見つけることは、あなたが探しているものだけを実行すると主張しています。
単体テストのカバレッジに頼るのではなく、実行中のアプリケーションを監視するCoberturaやEmmaのようなものが欲しいですか? –