Java: найдите использование кода отражения - PullRequest
6 голосов
/ 05 сентября 2011

У нас огромная кодовая база, и некоторые классы часто используются с помощью рефлексии по всему коду. Мы можем безопасно удалить классы, и компилятор доволен, но некоторые из них используются динамически с использованием отражения, поэтому я не могу найти их иначе, чем поиск строк ...

Есть ли какой-нибудь проводник отражений для кода Java?

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

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

Отражения по определению очень динамичны, и вы должны запустить правильный код, чтобы увидеть, что он будет делать. то есть вы должны пройти разумные тесты. Вы можете добавить протоколирование ко всему, что делает Reflection, если вы можете получить доступ к этому коду, или, возможно, вы можете использовать инструментарий этих библиотек (или изменить их напрямую)

3 голосов
/ 05 сентября 2011

Я предлагаю, используя соответствующим образом лицензированный источник для вашей JRE, модифицировать классы отражения, чтобы регистрировать, когда классы используются отражением (используйте карту / WeakHashMap, чтобы игнорировать дубликаты). Ваши измененные системные классы могут заменить классы rt.jar на -Xbootclasspath/p: в командной строке (в Oracle "Sun" JRE другие, вероятно, будут иметь что-то похожее). Запустите вашу программу и тесты и посмотрите, что получится.

(Возможно, вам придется разобраться с проблемами с порядком загрузки классов в системных классах.)

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

Как уже упоминалось в других постерах, это невозможно сделать статическим анализом из-за динамического характера отражения.Если вы используете Eclipse, этот инструмент покрытия может оказаться полезным, и с ним очень легко работать.Это называется EclEmma

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

Я сомневаюсь, что любая такая утилита легко доступна, но я могу ошибаться.

Это довольно сложно, учитывая, что динамически загружаемые классы (через отражение) сами могут загружать другие классы динамически и что имена загруженных классов могут быть получены из переменных или некоторого ввода во время выполнения.

Ваша база кодавероятно, не делает ни того, ни другого.Если это одноразовый поиск строк, может быть хорошим вариантом.Или вы ищете вызовы методов отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...