Frage

Ich arbeite an einer Bibliothek, wo wir bestimmen wollen, wie viel von unserer Bibliothek verwendet wird. I.E. Wir wollen wissen, wie viele Methoden in unserer Bibliothek öffentlich sind, aber nie genannt werden.

Ziel: statische Analyse Ermitteln Sie, wie viele Zeilen Code Aufruf jede öffentliche Methode in Paket A im aktuellen Projekt. Wenn die Anzahl der Anrufe Null ist, sollte die Methode als solche gemeldet werden.

War es hilfreich?

Lösung

Ich glaub du für diese Eclipse-Plugin suchen -> UCDetector

Aus der Dokumentation (Pay-Mitteilung an zweitem Punkt)

  • Unnötige (tot) Code
  • Code, wo die Sichtbarkeit zu schützen geändert könnten, default oder privat
  • Methoden der Felder, die letzte sein kann

in größerem Maßstab, wenn Sie die Level Static Analysis Objekt machen wollen, schauen Sie sich dieses Tool von IBM -> Strukturanalyse für Java . Es ist wirklich hilfreich für die Objektanalyse von Bibliotheken, APIs, etc.

Andere Tipps

Nicht genau das, was Sie suchen, aber:

Etwas Ähnliches mit Code-Coverage-Tools durchgeführt werden (wie Cobertura ). Sie tun nicht statische Überprüfung des Quellcodes, sondern Instrument der Bytecode-Metriken zur Laufzeit zu sammeln. Natürlich müssen Sie die Anwendung in einer Art und Weise fahren, die alle Nutzungsmuster ausübt, und möglicherweise die selteneren Codepfade verpassen.

Auf der statischen Analyse Front, vielleicht diese Tools können Sie helfen (das Apache-Projekt verwendet sie für die API-Kompatibilität für neue Versionen zu überprüfen, scheint, wie diese Aufgabe etwas verwandt ist, was Sie zu tun versuchen):

  • Clirr ist ein Tool, das mit älteren Versionen von Java-Bibliotheken für Binär- und Quell Kompatibilität überprüft. Grundsätzlich geben Sie ihm zwei Sätze von JAR-Dateien und Clirr Dumps eine Liste der Änderungen in der Öffentlichkeit api aus.
  • JDiff ist ein Javadoc Doclet, die einen HTML-Bericht aller Pakete, Klassen, Konstruktoren, Methoden erzeugt und Felder, die in irgendeiner Art und Weise entfernt, hinzugefügt oder verändert wurden, einschließlich der Dokumentation, wenn zwei APIs verglichen werden.

Client Verwendung von reflektierenden Anrufen ist ein Loch in der statischen Analyse zu berücksichtigen. Da gibt es keine Möglichkeit, sicher zu wissen, dass eine bestimmte Methode wird nicht über einige bizarre Reflexionsschema genannt wird. Also, vielleicht eine Kombination aus Laufzeit und statischer Analyse könnte am besten sein.

Ich glaube nicht, Sie in der Lage sind, zu messen, wie „oft“ eine Klasse oder eine Funktion benötigt wird.
Es gibt einige einfache Fragen:

  • Was definiert, wenn eine Nutzungsstatistik Ihres Spiels Bibliothek ist „normal“ oder ein „Ausreißer“? zu oft ist es falsch, sich im Spiel zu töten? Sie würden die „killScreen“ Klasse häufiger wie ein guter Spieler verwenden.
  • Was "viel" definiert? Zeit oder Nutzung zählen? POJOs wird selten Zeit verbrauchen, sind aber recht häufig verwendet.

Fazit:
Ich weiß nicht, was Sie versuchen zu erreichen.
Wenn Sie Ihren Code Abhängigkeiten angezeigt werden sollen, gibt es andere Tools , dies zu tun . Wenn Sie versuchen, Ihre Codeausführung zu messen, gibt es Profiler oder Benchmarks für Java. Wenn Sie eine Statistik Aussenseiter sind, werden Sie mit Rapidminer;)

Viel Glück dabei!

Ich würde vorschlagen, JDepend zeigt Ihnen die Abhängigkeiten zwischen Paketen und Klassen, ausgezeichnete zyklische Abhängigkeiten zu finden! http://clarkware.com/software/JDepend.html (Es eine Eclipse-Plugin hat: http://andrei.gmxhome.de/jdepend4eclipse/

und auch für andere Metriken PMD http://pmd.sourceforge.net/

IntelliJ hat ein Tool zur Erkennung Methoden, Felder, Klasse, die eingeschränkteren Modifikatoren haben. Es ist auch eine hat eine schnelle Lösung, diese Änderungen zu übernehmen, die Ihnen viel Arbeit auch sparen können. Wenn Sie nicht dafür bezahlen wollen, können Sie die 30-Tage-eval Lizenz erhalten, die mehr als genug Zeit, um Ihren Code zu ändern, es ist nicht etwas, das Du sollte sehr oft tun müssen.

BTW:. IntelliJ hat über 650 Code-Inspektionen Code-Qualität zu verbessern, etwa die Hälfte verfügt über eine automatische Korrekturen, so schlage ich ein paar Tage verbringen sie mit Ihrem Code Refactoring / aufräumen

Bitte nehmen Sie sich einen Blick auf Dead Code Detector . Sie behauptet, genau das zu tun, was Sie suchen:. Suche nicht verwendeten Code statische Analyse mit

Hier sind ein paar Listen von Java Code-Coverage-Tool. Ich habe nicht eine dieser persönlich in Anspruch genommen, aber es könnte Ihnen den Start:

Proguard kann eine Option sein zu ( http://proguard.sourceforge.net/ ):

"Einige Anwendungen von ProGuard sind:

  • ...
  • Listing toten Code, so kann es aus dem Quellcode entfernt werden.
  • ... „

Siehe auch http://proguard.sourceforge.net/manual/examples.html #deadcode

:

Sie können Ihr eigenes Programm für die (innerhalb einer Stunde nach der Lektüre dieses) mit der ASM-Bytecode Analysebibliothek ( http schreiben //asm.ow2.org ). Sie erhalten eine ClassVisitor und MethodVisitor implementieren müssen. Sie erhalten einen ClassReader verwenden die Klassendateien in Ihrer Bibliothek zu analysieren.

  • Ihre ClassVisitor des visitMethod (..) wird für jeden deklarierten Methode aufgerufen werden.
  • Ihre MethodVisitor des visitMethodInsn (..) wird für jede aufgerufene Methode aufgerufen werden.

Achten Sie auf eine Karte das Zählen zu tun. Die Tasten stellen die Methoden (siehe unten). Hier einige Code:

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);
    }
    // ...
}

Im Grunde genommen das ist es. Your're Start der Show mit so etwas wie folgt aus:

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

Genießen Sie!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top