Как найти статические вызовы методов в большом Java-проекте? - PullRequest
2 голосов
/ 06 октября 2009

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

// Before:
DAO.doSomething(dataSource, arg1, ..., argN)

// After:
dao.doSomething(arg1, ..., argN)

Моя проблема в том, что в большом проекте может быть трудно найти, где выполняются статические вызовы методов. Есть ли простой способ сделать это, из командной строки или в Eclipse?

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

String.valueOf(...)
Integer.parseInt(...)
MyClass.someBenignStaticMethod(...)

Некоторые уточнения:

  • Меня не интересует поиск вызовов методов, выполненных с помощью отражения
  • Я не знаю, какие статические методы в настоящее время существуют в этом проекте, поэтому это не так просто, как поиск их вызывающих абонентов с помощью команды Eclipse «Open Call Hierarchy» (Ctrl-Alt-H), хотя и простой способ поиска не приватные статические методы позволили бы мне использовать этот подход
  • Мне также интересно находить вызовы статических методов, находящихся вне моего проекта, например, javax.mail.Transport # отправка
  • Я ищу бесплатное (как в пиве) решение

Ответы [ 6 ]

3 голосов
/ 06 октября 2009

Вам действительно нужно искать? Почему бы не закомментировать статические вызовы методов один за другим? Когда вы скомпилируете его, он очистит ссылки.

1 голос
/ 08 октября 2009

Я написал небольшую Java-программу, которая использует отличную библиотеку ASM . Это позволяет исключить пакеты, такие как java.lang, и выдает результат, который выглядит следующим образом:

+ java
  + io
    - File
      # createTempFile(java.lang.String, java.lang.String)
+ javax
  + imageio
    - ImageIO
      # read(java.io.InputStream)
      # write(java.awt.image.RenderedImage, java.lang.String, java.io.File)
  + mail
    - Transport
      # send(javax.mail.Message)
    + internet
      - InternetAddress
        # parse(java.lang.String, boolean)
  + xml
    + parsers
      - DocumentBuilderFactory
        # newInstance()

Я бы предпочел что-то более простое в моем существующем процессе сборки, использующее CheckStyle, но это лучшее решение, которое я когда-либо придумал.

1 голос
/ 06 октября 2009

У нас есть продукт под названием nWire for Java , который может помочь. nWire анализирует ваш код и создает базу данных ваших компонентов и ассоциаций кода. Вы можете увидеть краткую демонстрацию на нашем веб-сайте.

Мы планируем добавить возможности отчетности в будущем. Между тем, если у вас есть некоторый базовый опыт работы с базами данных, вы можете подключиться к репозиторию nWire и с помощью простого запроса SQL получить список всех ваших статических методов (вы также можете увидеть вызовы там). nWire использует движок H2 базы данных с открытым исходным кодом и бесплатно.

Я могу помочь в доступе к базе данных. Напишите мне, чтобы поддержать [at] nwiresoftware.com.

1 голос
/ 06 октября 2009

Некоторые IDE поддерживают рефакторинг. Вы можете рефакторинг каждого статического метода один за другим.

В Eclipse вы можете просмотреть иерархию вызовов, чтобы увидеть всех вызывающих такой метод. Чтобы просмотреть иерархию вызовов, выберите имя метода и нажмите Command-Alt-H или щелкните правой кнопкой мыши на символе и выберите «Открыть иерархию вызовов».

1 голос
/ 06 октября 2009

Я бы использовал grep (-R в Linux) для поиска начального caps-dot-camel case-open (я не использую его достаточно, чтобы дать вам полную командную строку). А потом grep -v чтобы избавиться от мусора.

Ну, на самом деле я бы постепенно увеличивал рефакторинг. Изменяет метод и видит, что ломается (если ничего не ломается, удалите код).

Теоретически вы можете искать в файлах классов, ища invokestatic. Инфраструктура FindBugs, вероятно, здесь поможет (может быть, лучше начать).

0 голосов
/ 15 мая 2016

Возможным решением может быть пользовательский CheckSyle или PMD или ... предупреждение. В настоящее время у меня та же проблема, и я пробую ее с CheckStyle. Кажется, правильно написать такое расширение.

...