2009-04-20 12 views
5

私は、私たちのライブラリのどれくらいが使用されているかを判断したいライブラリに取り組んでいます。 I.私たちは図書館のどのメソッドが公開されているのか知っていますが、呼び出されることはありません。Javaコード使用チェッカー

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

+0

単体テストのカバレッジに頼るのではなく、実行中のアプリケーションを監視するCoberturaやEmmaのようなものが欲しいですか? –

答えて

9

用PMD

とも私はあなたがこのEclipseのプラグインを探しています信じて - >UCDetector

ドキュメントから(有料予告第2の箇条書きまで)

  • 不要(死んだ)コード
  • 視認性が保護され、デフォルトまたは大規模に

最終できるフィールドの プライベート

  • 方法に変更することができ、コードあなたがオブジェクトレベル静的解析を行いたい場合は、見てIBMのこのツールで - >Structural Analysis for Javaライブラリ、APIなどのオブジェクト解析に役立ちます。

  • 0

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

    +0

    コードカバレッジツールの問題点は、実行時に機能するため、「まれな」コードパスを見逃す可能性があることです。 – Thilo

    3

    あなたが探しているわけではありませんまさに、しかし:同様の

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

    、多分これらのツールはあなたを助けることができる(Apacheプロジェクトは、新しいリリースのためのAPIの互換性をチェックするためにそれらを使用して、そのタスクが何をしようとするとある程度関係しているように思える):

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

    クラスや機能が必要な頻度を測定することはできません。

    • あなたのゲームライブラリの利用統計は、「通常」または「外れ値」であれば、定義は何:
      いくつかの簡単な質問がありますか?あまりにも頻繁にゲームで自分自身を殺すことは間違っていますか?あなたは良いゲーマーのように、より頻繁に "killScreen"クラスを使用します。
    • 「多く」は何を定義していますか?時間または使用回数? POJOはまれな時間を消費しますが、かなり頻繁に使用されます。

    結論:
    私はあなたが達成しようとしているのかわかりません。
    コードの依存関係を表示する場合は、これを行うためのtoolsがあります。コード実行を測定しようとしている場合は、Java用にprofiler or benchmarksがあります。あなたが統計的なオタクなら、あなたはRapidMinerに満足します;)

    それと幸運!

    3

    クライアントの反射呼び出しは、静的解析で考慮する1つの穴です。特定のメソッドがいくつかの奇妙なリフレクションスキームによって呼び出されていないことを確実に知る方法がないため。したがって、ランタイムと静的解析の組み合わせが最適かもしれません。

    0

    ProGuardのは、あまりにもオプション(http://proguard.sourceforge.net/)であってもよい:

    「ProGuardの一部の用途は以下のとおりです。

    • ...
    • デッドコードをリスト、それから取り外すことができますソースコード。
    • ... "

    は、ASMバイトコード解析ライブラリ(http://asm.ow2.org)を使用して(これを読んだ後、数時間以内)もhttp://proguard.sourceforge.net/manual/examples.html#deadcode

    0

    あなたはそのための独自のユーティリティを書くことができます参照してください。 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()); 
        } 
    } 
    

    お楽しみください!

    +0

    メソッドAがメソッドBを呼び出す場合、メソッドAが使用されていない場合でもメソッドBは「使用済み」とマークされます。したがって、これは正しくカウントする方法ではありません。あなたは "中古"の過渡的な閉鎖を取る必要があります。 –

    1

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

    BTW:IntelliJには、コードの品質を向上させるための約650のコード検査があります。約半分は自動修正があるため、数日かけてコードをリファクタリング/整理することをお勧めします。

    1

    Dead Code Detectorをご覧ください。静的解析を使用して未使用のコードを見つけることは、あなたが探しているものだけを実行すると主張しています。

    関連する問題