5

私は、ライブラリがどれだけ使用されているかを判断したいライブラリに取り組んでいます。IE では、ライブラリ内で公開されているが呼び出されていないメソッドの数を知りたいと考えています。

目標: 静的解析 現在のプロジェクトのパッケージ A の各パブリック メソッドを呼び出すコードの行数を決定します。呼び出し回数がゼロの場合、メソッドはそのように報告されるべきです。

4

10 に答える 10

9

このEclipseプラグインを探していると思います-> UCDetector

ドキュメントから(2番目の箇条書きに注意してください)

  • 不要な (死んだ) コード
  • 可視性を保護、デフォルト、またはプライベートに変更できるコード
  • 最終的なフィールドのメソッド

大規模に、オブジェクト レベルの静的分析を実行する場合は、IBM のこのツールを参照してください --> Structural Analysis for Java。ライブラリ、API などのオブジェクト解析に非常に役立ちます。

于 2009-06-02T02:28:06.727 に答える
3

クライアントによるリフレクティブコールの使用は、静的分析で考慮すべき1つの穴です。特定のメソッドが奇妙なリフレクションスキームを介して呼び出されていないことを確認する方法がないためです。したがって、実行時分析と静的分析の組み合わせが最適な場合があります。

于 2009-06-02T03:03:34.580 に答える
1

デッドコード検出器をご覧ください。それはあなたが探していることをすることを主張します:静的分析を使用して未使用のコードを見つけること。

于 2009-06-08T07:17:55.090 に答える
1

クラスまたは関数が必要な「頻度」を測定できるとは思いません。
いくつかの簡単な質問があります:

  • ゲーム ライブラリの使用統計が「正常」か「外れ値」かを定義するものは何ですか? ゲームで頻繁に自殺するのは間違っていますか? 優れたゲーマーのように、「killScreen」クラスをより頻繁に使用します。
  • 「たくさん」の定義は?時間または使用回数?POJO はめったに時間を消費しませんが、かなり頻繁に使用されます。

結論:
あなたが何を達成しようとしているのかわかりません。
コードの依存関係を表示したい場合は、これを行うための他のツールがあります。コードの実行を測定しようとしている場合は、Java のプロファイラーまたはベンチマークがあります。あなたが統計マニアなら、RapidMinerに満足するでしょう;)

それでは頑張ってください!

于 2009-04-20T08:48:59.150 に答える
1

IntelliJ には、より制限された修飾子を持つことができるメソッド、フィールド、クラスを検出するツールがあります。また、これらの変更を適用するための簡単な修正もあり、多くの作業を節約できます. お金を払いたくない場合は、30 日間の評価ライセンスを取得できます。これは、コードを変更するのに十分な時間であり、頻繁に行う必要があるものではありません。

ところで: IntelliJ には、コードの品質を向上させるための約 650 のコード インスペクションがあり、約半分には自動修正機能があるため、コードをリファクタリング/整理するために数日使用することをお勧めします。

于 2009-06-06T09:42:21.400 に答える
1

JDepend は、パッケージとクラスの間の依存関係を表示することをお勧めします。循環的な依存関係を見つけるのに優れています。 http://clarkware.com/software/JDepend.html (Eclipse プラグインがあります: http://andrei.gmxhome.de/jdepend4eclipse/

また、他のメトリックの PMD http://pmd.sourceforge.net/

于 2009-04-20T13:42:45.933 に答える
0

ASM バイトコード分析ライブラリ ( http://asm.ow2.org ) を使用して、(これを読んでから 1 時間以内に) そのための独自のユーティリティを作成できます。ClassVisitor と MethodVisitor を実装する必要があります。ClassReader を使用して、ライブラリ内のクラス ファイルを解析します。

  • ClassVisitor の visitMethod(..) は、宣言されたメソッドごとに呼び出されます。
  • MethodVisitor の visitMethodInsn(..) は、呼び出されたメソッドごとに呼び出されます。

カウントを行うためにマップを維持します。キーはメソッドを表します (以下を参照)。ここにいくつかのコードがあります:

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());
    }
}

楽しみ!

于 2009-06-05T22:44:21.483 に答える
0

Proguard もオプションになる場合があります ( http://proguard.sourceforge.net/ ):

「ProGuard の用途には次のようなものがあります。

  • ...
  • ソース コードから削除できるように、デッド コードをリストします。
  • ... "

http://proguard.sourceforge.net/manual/examples.html#deadcodeも参照してください

于 2009-06-04T22:50:43.497 に答える