質問

私はライブラリの使用量を確認したいライブラリに取り組んでいます。I.E.ライブラリ内でパブリックであるにもかかわらず呼び出されないメソッドがいくつあるかを知りたいと考えています。

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

役に立ちましたか?

解決

あなたはこの Eclipse プラグインを探していると思います --> UCディテクター

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

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

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

他のヒント

正確にはあなたが探しているものではありませんが、:

コード カバレッジ ツール ( コベルトゥーラ)。ソース コードの静的検査は行いませんが、バイトコードを計測して実行時にメトリクスを収集します。もちろん、すべての使用パターンを実行する方法でアプリケーションを駆動する必要があるため、まれなコード パスを見逃す可能性があります。

静的分析の面では、次のツールが役に立つかもしれません (Apache プロジェクトは新しいリリースの API 互換性をチェックするためにツールを使用しています。そのタスクはあなたがやろうとしていることに多少関連しているようです)。

  • クリル Java ライブラリのバイナリおよびソースと古いリリースとの互換性をチェックするツールです。基本的に、2 セットの jar ファイルを与えると、Clirr はパブリック API の変更のリストをダンプします。
  • Jディフ は、2 つの API を比較するときに、ドキュメントを含め、何らかの方法で削除、追加、または変更されたすべてのパッケージ、クラス、コンストラクター、メソッド、およびフィールドの HTML レポートを生成する Javadoc ドックレットです。
反射通話の

クライアントの使用は考慮すべき静的解析における一つの穴です。特定の方法は、いくつかの奇妙な反射スキームを経由して呼び出されていないことを確実に知る方法はありませんよう。だから、多分ランタイムと静的解析の組み合わせは最高かもしれません。

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

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

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

頑張ってください!

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

や他のメトリックのPMD http://pmd.sourceforge.net/する

IntelliJのは、より制限された修飾子を持つことができるメソッド、フィールド、クラスを検出するためのツールを持っています。それはまた、同様にあなたに多くの作業を保存することができ、これらの変更を適用するための簡単な修正を持っています。あなたはそれを支払うしたくない場合は、あなたのコード、あなたは非常に頻繁に行う必要がある必要があり、そのない何かを変更するのに十分な時間以上で30日間の評価ライセンスを取得することができます。

ところで:IntelliJのは、コードの品質を向上させるために約650のコードの点検を持っている私は整頓/あなたのコードをリファクタリングするためにそれを使用して一日を過ごす提案するので、約半分は、自動修正を持っている。

デッドコードの検出器のを見てみてください。それはあなたが探しているだけで何やって主張:静的解析を使用して、未使用のコードを見つける

Java コード カバレッジ ツールのリストをいくつか示します。私はこれらを個人的に使用したことはありませんが、始めるきっかけになるかもしれません。

プロガードもオプションかもしれません(http://proguard.sourceforge.net/):

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

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

こちらも参照 http://proguard.sourceforge.net/manual/examples.html#deadcode

ASM バイトコード分析ライブラリ (これを読んでから 1 時間以内に) を使用して、独自のユーティリティを作成できます。http://asm.ow2.org)。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());
    }
}

楽しむ!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top