Анализ байтов / исходного кода Java - как найти все классы / методы, которые используют другой класс, программно? - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно программно знать, какие классы вызывают (и скажем, X) методы получения и установки данного класса. Ключевым моментом здесь является «программно».

Например, если класс A использует setPropertyABC () X, а класс B использует getPropertyABC () X, я хотел бы определить зависимость между классами на основе их обращений к X - в этом случае выполнение класса A должно предшествовать классу B .

Мне нужно сделать это программно (не через IDE). Я хочу создать программу, которая будет смотреть на скомпилированные байтовые коды или исходный код классов и выяснять, какие классы используют какие методы для данного класса. Какую библиотеку Java лучше всего использовать для этой цели? Инструменты байт-кода более уместны? Я думал, может ли ANTLR сделать эту работу, но я не уверен. Есть ли пример кода в открытом доступе, который решает эту проблему?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Несколько лет назад я выполнил упражнение, анализируя зависимости на уровне исходного кода, используя инструмент под названием Dependency Finder. Я сообщил о проекте в http://dev.saxonica.com/blog/mike/2009/09/analyzing-dependencies-in-a-class-library-a-use-case-for-xslt-streaming.html

Инструмент выводит информацию (в форме XML) о зависимостях между модулями и настраивается с учетом степени детализации отчетов. Я провел немалый анализ XML-отчетов (используя XSLT), чтобы получить необходимое понимание структуры кода, которая в данном случае была всей библиотекой OpenJDK.

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

Публичные комментарии к статье блога также указывают на несколько других инструментов анализа зависимостей.

0 голосов
/ 05 сентября 2018

После рассмотрения всех альтернатив, я решил пойти с библиотекой ASM для анализа байтового кода. Это оказалось весьма подходящим и полезным. Спасибо всем за ваши ответы.

0 голосов
/ 28 августа 2018

Может быть, вы могли бы использовать Аспекты . У вас будет pointcut, который перехватывает все методы класса get* и set*. Советник может использовать Thread.currentThread().getStackTrace(), чтобы выяснить, что это за метод вызова, а затем записать результаты. Это не совсем метод анализа байт-кода, но, вероятно, более простой.

[править] А что касается вычисления своего рода временной зависимости между двумя классами, один из которых зависит от метода вызова, вызываемого чем-то другим, ваш советник может добавлять информацию о каждом вызове к некоторой структуре данных порядка вставки (LinkedHashMap). Если вызывается getX, вы смотрите на то, что были сделаны звонки на setX.

...