Как определить, какие методы используются классом Java - PullRequest
3 голосов
/ 14 мая 2010

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

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

Ответы [ 5 ]

2 голосов
/ 02 февраля 2011

javap -c class1 class2 ... | grep invoke

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

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

javap -c class1 class2 ... | grep getstatic (поиск также Puttatic, Putfield, Getfield)

1 голос
/ 20 мая 2010

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

  1. сделать глобальный поиск / замену в вашем коде для "импорта x.y.Z "со статическим классом Z {} где пакет x.y от вашего третьего участника

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

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

0 голосов
/ 20 мая 2010

Если вам нужна большая мощность и гибкость, я бы обязательно взглянул на библиотеку ASM

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

0 голосов
/ 20 мая 2010

Я не знаю конкретного инструмента для этого, но мне кажется, что это можно сделать с умеренными трудностями, используя скрипт perl, если у вас есть jar или источник.

Вы можете запустить jar через jad http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler), чтобы сгенерировать источник, а затем написать скрипт на Perl, который:

  1. Сканирует каждый файл вашего источника

    а. находит все строки выражения import reg

    b находит все исходные файлы в декомпилированном стороннем источнике, который соответствует импортированному пакет

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

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

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

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

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

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

0 голосов
/ 14 мая 2010

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

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