2010-05-13 4 views
3

Мне нужно предоставить отчет, какие API-интерфейсы используются нашим кодом, и точно, какие методы вызывают. Для Windows DLL я бы использовал «dumpbin/import» - есть ли эквивалент для файла Java .class?Как определить, какие методы используются классом Java

javap похоже на очевидное место для поиска, но я не могу найти никаких вариантов, которые, кажется, делают то, что мне нужно.

+0

Что именно вы ищете: - что третья сторона используются пакеты/классы/методы по вашему коду? - Какие методы * не * используются для поиска мертвого кода? Также имейте в виду, что такой анализ может быть неполным, если вы используете отражение. Обратите внимание, что в простейшем случае вы можете просто искать grep для всех операторов импорта в * .java-файлах ... –

+0

Какие сторонние пакеты/классы/методы используются нашим кодом. В частности, мы поставляем .jar клиенту, и они хотят точно знать, какие методы он вызывает. Просто grepping для операторов импорта скажет нам, какие пакеты мы используем, но они хотят список каждого метода (и прежде чем спросить, нет, я не знаю почему). –

+0

На всякий случай вы попытаетесь убедить клиента в противном случае: так что, если какая-то библиотека вызывает какой-то метод из другой библиотеки ...? Или что, если ваш собственный метод (который вызывает некоторый библиотечный метод) никогда не вызывается? – Arjan

ответ

2

javap -c class1 class2 ... | grep invoke

вы получите все время выполнения вызовов. Вы должны отфильтровать их из своих API, и вы получите вызовы импортированных методов.

Вы также можете определить используемые импортированные поля:

javap -c class1 class2 ... | grep getstatic (поиск и putstatic, putfield, GetField)

+0

Спасибо! Я знал, что должен быть какой-то путь :-) –

0

Как насчет Apache/Maven jxr?

+0

Я раньше не использовал jxr, но из того, что я вижу из документации, он генерирует HTML из нашего источника и не расскажет нам ничего о вызываемых им методах сторонних разработчиков (см. Комментарий выше)? –

+0

Это как API. Вы можете это назвать. – bmargulies

1

Это жестокое, но вы могли бы попробовать что-то вроде этого:

  1. сделать глобальный поиск/заменить в коде для «импорта А» со статическим классом Z {}, где пакетом х из ваших ThirdParty

  2. банки запустить скрипт компиляции (или скопировать ошибки из вашего IDE, если это возможно)

  3. процесса ошибки компиляции ищет «The method xxx is undefined» тип сообщений

+0

Метод, который я описал, может возвращать ошибочные результаты, если переменная называется так же, как метод, но описанный здесь метод не будет иметь этого недостатка. Я не думаю, что это было бы так жестоко, если вы напишете скрипт perl/python/ruby ​​/ sed для этого. +1 для правильного и работоспособного решения. –

+0

Спасибо за предложения, ребята. Я надеялся, что это может быть проще, чем это - похоже на dumpbin/exports в Windows или nm -u на Linux. Ах, хорошо, вздох, такая жизнь. Еще раз спасибо! –

0

Я не знаю, специальный инструмент, чтобы сделать это, но мне кажется, это может быть сделано с умеренной сложности с использованием Perl-скрипт, если у вас есть сосуд или источник ,

Вы можете запустить банку через JAD http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler) для создания источника, а затем написать PERL скрипт, который:

  1. просматривает каждый файл источника

    а. находит все выражение строка импорта рег

    б находит все исходные файлы в декомпилированном источнике третьей стороны, которая соответствует импортируемому ПАКЕТА

    гр. для каждого файла в третьей стороне, извлеките имена методов

    d. если он совпадает, сохраните метод + класс + пакет.

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

Как только метод используется, его можно удалить из таблицы, так как вам не нужно искать его снова.

Но, вероятно, метода грубой силы достаточно, потому что это не проблема с интенсивным вычислением (хотя, конечно, для человека это было бы очень трудоемким!).

Замените ruby ​​/ python/php/sed/awk для perl, если это ваше предпочтение.

0

Если вы хотите много мощности и гибкости, я бы определенно взглянуть на ASM library

Есть в основном много хороших инструментов для анализа и манипулирования Java байткод.Одним из наиболее полезных из них является API на основе vistor, который может проходить через внутренние компоненты любого класса и выполнять любой анализ, который вы хотите (в вашем случае обнаруживаете, к каким другим классам/пакетам относятся ссылки).

Смежные вопросы