FindBugs を使用して、ソース ツリーで未使用のメソッドを検出することは可能ですか? ユーザーがそれを行うと主張しているSOに関するいくつかの投稿、FBでこれを行う方法を尋ねる投稿、およびFBがこれを行うことができないと主張する投稿を目にします。
これがどのように行われるかを確実に知っている人はいますか?私は他の場所から明示的に呼び出されていないメソッドにのみ興味があり、リフレクションは気にしません。
FindBugs を使用して、ソース ツリーで未使用のメソッドを検出することは可能ですか? ユーザーがそれを行うと主張しているSOに関するいくつかの投稿、FBでこれを行う方法を尋ねる投稿、およびFBがこれを行うことができないと主張する投稿を目にします。
これがどのように行われるかを確実に知っている人はいますか?私は他の場所から明示的に呼び出されていないメソッドにのみ興味があり、リフレクションは気にしません。
FindBugs チームのメンバーとして、残念ながら FindBugs はこれを行わないことをお伝えします。私たちの Web サイトでバグ パターンを検索すると、「未使用」の検出器について言及されているのは未使用のフィールドのみです。
私が現在取り組んでいるプロジェクトは、これだけです....それは非常に早い段階なので、おそらくたくさんのバグが残っています:
Findbugsがプライベートで報告するのと同じように使用されていないパブリックメソッドについて報告することはかなり可能だと思います(それか私はコンパイラフラグを考えています:-)。
本当の問題は、なぜあなたも欲しいのかということです。閉じられて拡張されることのないプログラムを作成している場合は、未使用のメソッドを見つけることで、それらを削除する機会が得られます。しかし、APIを作成している場合、誰がそれらのメソッドを必要とするかを予測できないため、それらについて報告する意味はあまりありません。
まあ、findbugs-1.3.9 の時点では、未使用のメソッドをキャッチしていないようです。
この小さなサンプルで findbugs を実行したとき:
public class TestJava
{
int j;
public static void main(String[] args)
{
System.out.println("Nothing.");
}
public void foo()
{
}
public static void bar()
{
}
}
foo も bar も未使用であることはわかりませんでした。TestJava.jが未使用のフィールドであることがわかりました。
Unused field
This field is never used. Consider removing it from the class.
findbugs は完璧にはほど遠いですが、それでも非常に便利なツールです。
未使用のメソッドの候補を見つけるための(私にとっての)最善のアプローチは、emmaなどのカバレッジツールを使用することです。
アプリケーションをインストルメント化し、過度に使用して、emmaログを調べます-セッション中に使用されなかったメソッドは使用されていない可能性があり、お気に入りのIDE(Eclipse、...)を使用して、訪問されていないメソッド呼び出し階層を調べることができます。
バグや他のコードアナライザーを見つけることで、未使用のメソッドを実際に検出できるとは思えません。
たぶんcrap4jが必要です。単体テストが到達しないすべてのコードを削除します。もちろん、これはアプリを最小化するための難しい方法です。
使用されていないコード (使用されていないパブリック メソッドを含む) を削除することは、難読化者が行うことの 1 つです。問題は、それを含むクラスを見ただけでは、パブリック メソッドが使用されているかどうかを実際に判断できないことです。public メソッドはどこからでも呼び出される可能性があるため、実行するシステム全体を調べる必要があります。
システム全体 (つまり、システムを実行するために使用されるコードとすべてのライブラリ) に対して難読化ツールを実行すると、呼び出されないパブリック メソッドを見つけるのに役立ちます (注意: リフレクションはもちろん、その結果を台無しにする可能性があります!)。