Может обнаружить, что обнаружены неиспользуемые общедоступные методы

Можно ли обнаружить неиспользуемые методы в дереве источников с помощью FindBugs? Я вижу некоторые сообщения на SO, где пользователи заявляют об этом, некоторые другие спрашивают, как это сделать в FB и других, где они утверждают, что FB не может этого сделать.

Кто-нибудь знает наверняка, как это делается? Меня интересуют только те методы, которые явным образом не вызваны из других источников. Меня не волнует отражение.

Ответ 1

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

Ответ 2

У меня есть проект, над которым я сейчас работаю, это делает именно это... Это очень рано, так что, вероятно, осталось несколько ошибок:

https://github.com/mebigfatguy/deadmethods

Ответ 3

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

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

Ответ 4

Ну, а findbugs-1.3.9, кажется, что он не улавливает неиспользуемые методы. p >

Когда я запустил findbugs на этом маленьком образце:

public class TestJava
{
 int j;
 public static void main(String[] args)
 { 
   System.out.println("Nothing.");
 }
 public void foo()
 {
 }
 public static void bar()
 {
 }
}

Он не заметил, что ни foo, ни bar не используются. Он сделал, поймал, что TestJava.j - это неиспользуемое поле .

Unused field
This field is never used.  Consider removing it from the class.

findbugs далек от совершенства, но он все еще довольно полезный инструмент.

Ответ 5

Ну, так как вы хотите спуститься по этому маршруту, несмотря на предупреждения других, которые ответили:), вы можете скопировать и изменить детектор UPM делать то, что вам нужно.

Его очень просто написать детектор для FindBugs (особенно, когда у вас отличная отправная точка). Прочитайте этот, чтобы начать работу

Ответ 6

Лучший подход (для меня) найти кандидатов для неиспользуемых методов - использовать инструменты покрытия, такие как emma.

Прикрепите приложение к вашему приложению, используйте его чрезмерно и изучите журналы emma - методы, которые не были использованы во время сеанса, могут быть неиспользованными, и вы можете использовать свою любимую среду IDE (eclipse,...) для изучения иерархии вызовов невидимых методов.

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

  • вызываемый другими библиотеками (для всех неличных методов)
  • называется удаленно
  • вызывается с помощью API отражения (даже частные методы, с технической точки зрения)

Ответ 7

Удаление неиспользуемого кода (включая неиспользуемые общедоступные методы) - это одно из obfuscators. Проблема в том, что вы не можете сказать, используется ли общедоступный метод, просто глядя на класс, который его содержит. Вам нужно посмотреть на всю систему, которая будет запущена, потому что общедоступный метод может быть вызван повсюду.

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

Ответ 8

Возможно, crap4j - это то, что вам нужно. Он удаляет весь код, который не достигается модульными тестами. Это, конечно, трудный способ свести к минимуму ваше приложение.