2014-10-23 17 views
5

Ich möchte Statistiken über einen großen Korpus von Java-Code sammeln, auf den ich Zugriff habe. Einige Statistiken, an denen ich interessiert bin, könnten beinhalten, wie oft bestimmte Methoden/Klassen verwendet werden, wie oft bestimmte Pakete importiert werden und so weiter.Java Language Statistics

Mein erster Gedanke war, javaparser zu verwenden, aber diese Bibliothek unterstützt nur durch Java 1.5, und der meiste Code, den ich habe, ist in 1.6 oder größer.

Gibt es eine Bibliothek, die mir aus irgendeinem Java-Code eine genaue AST gibt (dh kann ich irgendwie nach javac fragen?), Oder gibt es eine bessere Möglichkeit, dieses Problem anzugehen (den Bytecode vielleicht untersuchen)?

+0

Ich würde in pmds [wie es funktioniert] (http://pmd.sourceforge.net/pmd-5.1.0/howitworks.html) graben und sehen, ob Sie das an das anpassen können, wonach Sie suchen. Das heißt, es ist nicht eine kleine Sache, an die Sie denken. –

+1

Ich habe KEINE Idee, wie ich das lösen kann, aber du bekommst einen Stern von mir, weil ich gerne herausfinden würde, was du daraus machst. Wenn Sie eine Antwort finden, posten Sie sie bitte als Antwort! Es würde eine Menge Leute im Internet helfen, wie Sie auf der Suche nach einer Lösung! – DreadHeadedDeveloper

+1

@DreadHeadedDeveloper Ich werde sicher zurück posten, wenn ich etwas herausgefunden habe. Wenn das nur so einfach wäre wie in Haskell ... (danke haskell-src-exts!) –

Antwort

0

Weiß nicht über genaue AST, aber Sie können sicherlich die Bytecodes mit Paketen wie ASM oder BCEL lesen, und das Scannen dieser Datenstrukturen für Funktionsaufrufe wäre einigermaßen unkompliziert. Natürlich kann dies nach einer frühen Optimierung geschehen, so dass es nicht direkt die Quelle widerspiegelt ... und es ist vor JIT, so dass es möglicherweise nicht direkt widerspiegelt, was tatsächlich läuft.

Eine andere Lösung wäre, den Code unter der Kontrolle eines Profilers auszuführen, der Ihnen die relative oder absolute Aufrufhäufigkeit von verschiedenen Orten geben könnte.

Keiner von diesen würde Ihnen eine Anzahl von Importen geben - das ist ein reines syntaktisches Zuckerdetail. Aber aus dem gleichen Grund halte ich das nicht für eine sinnvolle Nummer.

+0

Dieser Ansatz macht es möglicherweise relativ einfach, call * sites * zu finden. Der schwierige Teil des Problems besteht darin, zu bestimmen, welche spezifischen Zielmethoden aufgerufen werden sollen. Dafür benötigen Sie ein Call-Graph. Ja, die Rohdaten zum Erstellen eines Aufrufgraphen sind in ASM oder BCEL (genauso wie im Quellcode). Es ist nicht einfach, es zu extrahieren, da Sie entweder zuerst oder gleichzeitig eine Punkteanalyse durchführen müssen. –

+0

Für Aufrufmuster kann ein guter Profiler die beste Lösung sein - da Ihre Annahmen bei der Handanalyse des Codes möglicherweise nicht mit dem übereinstimmen, was tatsächlich passiert, wenn die Bedingungen über realem Code laufen, und Unterklassen möglicherweise Layer/Alternativen einführen erwarte nicht. – keshlam