Статический анализ графа вызовов Java - PullRequest
22 голосов
/ 10 февраля 2011

Что я хотел бы сделать, так это просканировать набор Java-классов и отследить все вызовы методов от определенного метода абстрактного класса, и в этом контексте создать список всего кода, который выполняет некоторую операцию (в этомcase, создает экземпляр определенного класса).Я хочу знать, номер строки и предоставленные аргументы.

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

Я наполовину ожидал, что инструмент или пример кода будут существовать, но я еще ничего не нашел.Такое ощущение, что я собираюсь изобретать велосипед.Но если я это сделаю, это будет колесо с открытым исходным кодом, доступное на GitHub; -)

PS: Вы найдете существующий вопрос " Как сгенерировать граф вызовов Java ", потому что онзвучит идентично, но это совсем не то, что мне нужно.

Ответы [ 5 ]

6 голосов
/ 18 мая 2012

Вы можете использовать набор инструментов java-callgraph для создания достаточно точных статических и динамических вызовов для Java.

5 голосов
/ 26 октября 2011

Вы можете попробовать JavaDepend , он предоставляет множество функций, необходимых для зависимостей и метрик, а также предоставляет CQL-подобный SQL для запроса базы кода.

4 голосов
/ 30 января 2012

Вы можете использовать Doxygen с Graphviz .Прост в установке и использовании.

4 голосов
/ 06 марта 2011

Сажа должна позволять вам легко достичь того, что вы ищете: http://www.sable.mcgill.ca/soot/

Он может автоматически создавать точные графики вызовов.

Вы можете найти всю необходимую документацию здесь:*http://www.sable.mcgill.ca/soot/tutorial/index.html

Также есть активная рассылка для Сажи.

2 голосов
/ 06 марта 2011

Звучит так, будто вы хотите что-то, что обеспечивает доступ к абстрактному синтаксису и полной таблице символов. Затем пользовательское сканирование AST функций в графе вызовов с корнями в каждом реализующем методе (как указано в таблицах символов) абстрактного метода дает вам возможность найти новую операцию, тип которой является конкретным интересующим классом.

DMS Software Reengineering Toolkit - это обобщенная технология компиляции, предоставляющая основные услуги синтаксического анализа, построения / навигации AST, построения / навигации по таблице символов, потока управления, потока данных и построения графа вызовов. DMS имеет необязательный Java Front End , который предоставляет полный анализатор Java, создает AST-таблицы Java и таблицы символов и может создавать граф вызовов. Интерфейс Java также может читать файлы .class; вам не было ясно, хотите ли вы тоже лезть в файлы классов, охотясь за информацией.

Ответ, который вы хотите, не с полки. Вам нужно создать некоторый пользовательский код для реализации идей из первого абзаца, но DMS может предоставить большую часть исходного материала. Он не предоставляет подробных сведений о файлах .class (они используются главным образом для разрешения типов в исходном коде).

...