2014-10-23 7 views
5

Я заинтересован в сборе статистики по большому корпусу Java-кода, к которому у меня есть доступ. Некоторая статистика, которая мне интересна, может включать в себя то, как часто используются определенные методы/классы, как часто импортируются определенные пакеты и т. Д.Статистика языка Java

Моя первая мысль заключалась в использовании javaparser, но эта библиотека поддерживает только через Java 1.5, и большая часть кода у меня есть в 1.6 или выше.

Есть ли библиотека, которая даст мне точный АСТ от некоторого Java-кода (т. Е. Могу я спросить Javac для него как-то?), Или есть лучший способ приблизиться к этой проблеме (возможно, обследование байт-кода)?

+0

Я бы копал в pmd [как это работает] (http://pmd.sourceforge.net/pmd-5.1.0/howitworks.html) и посмотреть, можете ли вы адаптировать его к тому, что вы ищете. Тем не менее, это не мелочь, о которой вы думаете. –

+1

У меня нет идеи, как решить эту проблему, но у вас есть звезда от меня, потому что мне хотелось бы узнать, что вы придумали. Если вы найдете ответ, отправьте его как ответ! Это поможет получить много людей в Интернете, как вы ищете решение! – DreadHeadedDeveloper

+1

@DreadHeadedDeveloper Я обязательно отправлю сообщение, когда я что-то придумаю. Если бы это было так просто, как в Haskell ... (спасибо haskell-src-exts!) –

ответ

0

Dunno о точном AST, но вы можете обязательно прочитать байт-коды, используя пакеты, такие как ASM или BCEL, и сканирование этих структур данных для вызовов функций было бы достаточно простым. Конечно, это может произойти после того, как была выполнена некоторая ранняя оптимизация, поэтому она не может напрямую отражать источник ... и это до JIT, поэтому она не может напрямую отражать то, что на самом деле работает.

Другим решением будет запуск кода под управлением профилировщика, который может дать вам либо относительную, либо абсолютную частоту вызова из разных мест.

Ни один из них не дал бы вам количество импортных товаров - это чисто синтаксически-сахарная деталь. Но по той же причине я не думаю, что это действительно значимое число.

+0

Этот подход может упростить поиск сайтов * вызовов *. Трудная часть проблемы заключается в определении того, какие конкретные целевые методы вызывает вызов сайта вызова? Для этого вам нужен граф вызовов. Да, необработанная информация для построения графика вызовов находится в ASM или BCEL (так же, как и в исходном коде). Извлечение нелегко, потому что вам нужно сделать анализ точек сначала, или одновременно. –

+0

Для шаблонов обращения хорошим профилировщиком может быть ваш лучший выбор - так как ваши предположения во время ручного анализа кода могут не совпадать с тем, что на самом деле происходит, когда условные выражения работают над кодом реального мира, а подклассы могут вводить слои/альтернативы, которые вы сделали Не ожидайте. – keshlam

Смежные вопросы