Поиск неиспользуемого кода в Java с AspectJ - PullRequest
1 голос
/ 22 июля 2011

У меня есть идея найти неиспользуемые («мертвые») методы в большом Java-проекте, но мне нужна помощь в получении реализации.

  1. Используйте AspectJ, чтобы добавить аспект «до» во ВСЕ методыв пакетах проекта.Аспект просто записывает (?), Что метод был выполнен.
  2. Я составляю список всех классов / методов в пакетах проектов (возможно, с использованием локатора / отражения службы).
  3. Рекомендуемый код подвергается полному регрессионному тестированию.В идеале я хотел бы также запустить это в производство на некоторое время (если можно найти подходящее эффективное решение).
  4. Сравнение списков выполненных методов (Шаг 1) и доступных методов (Шаг 2), приводя к полному списку всех методов, которые никогда не были вызваны (например, мертвый код).

Поскольку шаги 2 и 4 можно выполнять в автономном режиме, я действительно только ищу помощь с шагом 1.

В частности, как я могу записать, когда метод выполняется ?Я полагаю, что очень скоро столкнусь с OutOfMemoryErrors, если попытаюсь использовать какое-либо хранилище в памяти.Аналогично, если я храню данные в базе данных / в файловой системе, объем вызовов может вызвать серьезные проблемы с производительностью.Кто-нибудь когда-нибудь делал что-то подобное?Любые советы / предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Попробуйте проверить популярные библиотеки покрытия тестов, такие как Cobertura или EMMA . Они делают именно то, о чем вы говорите, а затем некоторые, но не с AspectJ. По крайней мере, у Кобертуры, похоже, нет проблем с хранением информации о вызовах вплоть до строки в памяти.

0 голосов
/ 22 июля 2011

Ну, вам нужен совет до звонка По этому совету вы хотите записать вызываемый метод Возможно, вы захотите сохранить набор вызываемых методов, чтобы не получать дубликаты. Вы можете получить текущий метод из thisJointPoint . Я мог бы дать код AspectJ для него, но я думаю, что это не относится к делу.

Я думаю, вам лучше использовать инструмент для анализа двоичных файлов .class, используя BECL или ASM , начиная с методов, которые вы знаете получить вызов и построить граф вызовов. Это похоже на то, как JVM выполняет сборку мусора.

Но, действительно, вы должны спросить себя, что вы такое. Это производительность? Потому что воздействия не должно быть. Если вы хотите уменьшить размер файлов .class, вам лучше использовать что-то вроде ProGuard . Это позаботится об этом и других вопросах, и это уже сделано.

Тем не менее, я думаю, что лучший подход, если вы действительно хотите это сделать, - это применить инструмент в своем коде с помощью Cobertura, выполнить прогон вашего приложения, а затем просмотреть отчеты о покрытии. Это не должно занять много времени, чтобы 90% используемого вами кода было написано. Любые невостребованные методы, которые можно удалить, не вызывая ошибки компиляции, являются мертвым кодом.

...