私は、ライブラリがどれだけ使用されているかを判断したいライブラリに取り組んでいます。IE では、ライブラリ内で公開されているが呼び出されていないメソッドの数を知りたいと考えています。
目標: 静的解析 現在のプロジェクトのパッケージ A の各パブリック メソッドを呼び出すコードの行数を決定します。呼び出し回数がゼロの場合、メソッドはそのように報告されるべきです。
私は、ライブラリがどれだけ使用されているかを判断したいライブラリに取り組んでいます。IE では、ライブラリ内で公開されているが呼び出されていないメソッドの数を知りたいと考えています。
目標: 静的解析 現在のプロジェクトのパッケージ A の各パブリック メソッドを呼び出すコードの行数を決定します。呼び出し回数がゼロの場合、メソッドはそのように報告されるべきです。
このEclipseプラグインを探していると思います-> UCDetector
ドキュメントから(2番目の箇条書きに注意してください)
大規模に、オブジェクト レベルの静的分析を実行する場合は、IBM のこのツールを参照してください --> Structural Analysis for Java。ライブラリ、API などのオブジェクト解析に非常に役立ちます。
クライアントによるリフレクティブコールの使用は、静的分析で考慮すべき1つの穴です。特定のメソッドが奇妙なリフレクションスキームを介して呼び出されていないことを確認する方法がないためです。したがって、実行時分析と静的分析の組み合わせが最適な場合があります。
デッドコード検出器をご覧ください。それはあなたが探していることをすることを主張します:静的分析を使用して未使用のコードを見つけること。
クラスまたは関数が必要な「頻度」を測定できるとは思いません。
いくつかの簡単な質問があります:
結論:
あなたが何を達成しようとしているのかわかりません。
コードの依存関係を表示したい場合は、これを行うための他のツールがあります。コードの実行を測定しようとしている場合は、Java のプロファイラーまたはベンチマークがあります。あなたが統計マニアなら、RapidMinerに満足するでしょう;)
それでは頑張ってください!
IntelliJ には、より制限された修飾子を持つことができるメソッド、フィールド、クラスを検出するツールがあります。また、これらの変更を適用するための簡単な修正もあり、多くの作業を節約できます. お金を払いたくない場合は、30 日間の評価ライセンスを取得できます。これは、コードを変更するのに十分な時間であり、頻繁に行う必要があるものではありません。
ところで: IntelliJ には、コードの品質を向上させるための約 650 のコード インスペクションがあり、約半分には自動修正機能があるため、コードをリファクタリング/整理するために数日使用することをお勧めします。
JDepend は、パッケージとクラスの間の依存関係を表示することをお勧めします。循環的な依存関係を見つけるのに優れています。 http://clarkware.com/software/JDepend.html (Eclipse プラグインがあります: http://andrei.gmxhome.de/jdepend4eclipse/
また、他のメトリックの PMD http://pmd.sourceforge.net/
ASM バイトコード分析ライブラリ ( http://asm.ow2.org ) を使用して、(これを読んでから 1 時間以内に) そのための独自のユーティリティを作成できます。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());
}
}
楽しみ!
Proguard もオプションになる場合があります ( http://proguard.sourceforge.net/ ):
「ProGuard の用途には次のようなものがあります。
http://proguard.sourceforge.net/manual/examples.html#deadcodeも参照してください