Java コード使用チェッカー
-
12-09-2019 - |
質問
私はライブラリの使用量を確認したいライブラリに取り組んでいます。I.E.ライブラリ内でパブリックであるにもかかわらず呼び出されないメソッドがいくつあるかを知りたいと考えています。
ゴール:静的分析では、現在のプロジェクトのパッケージAの各パブリックメソッドを呼び出すコードの行の数を決定します。呼び出し数がゼロの場合、メソッドはそのように報告される必要があります。
他のヒント
正確にはあなたが探しているものではありませんが、:
コード カバレッジ ツール ( コベルトゥーラ)。ソース コードの静的検査は行いませんが、バイトコードを計測して実行時にメトリクスを収集します。もちろん、すべての使用パターンを実行する方法でアプリケーションを駆動する必要があるため、まれなコード パスを見逃す可能性があります。
静的分析の面では、次のツールが役に立つかもしれません (Apache プロジェクトは新しいリリースの API 互換性をチェックするためにツールを使用しています。そのタスクはあなたがやろうとしていることに多少関連しているようです)。
クライアントの使用は考慮すべき静的解析における一つの穴です。特定の方法は、いくつかの奇妙な反射スキームを経由して呼び出されていないことを確実に知る方法はありませんよう。だから、多分ランタイムと静的解析の組み合わせは最高かもしれません。
クラスや関数がどのくらいの「頻度」で必要になるかを測定することはできないと思います。
いくつかの簡単な質問があります。
- ゲーム ライブラリの使用統計が「正常」か「異常値」かを定義するものは何ですか?ゲーム内で頻繁に自殺するのは間違っていますか?優れたゲーマーのように、「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());
}
}
楽しむ!