Как получить список методов класса Java с помощью библиотеки asm?
Делаю плагин Maven, который обфусцирует байт-код. Проблема в том, что если не запускать clean, то плагин дважды обфусцирует уже обфусцированные классы и потом эти классы не грузятся ява-машиной. Обфускация через invoke dynamic с помощью паттерна ClassVisitor библиотеки asm.
Хочу сделать определение нужно ли обфусцировать класс на основе того, что в классе уже есть специальный метод, который возникает при обфускации. Но не могу найти как в ClassVisitor получить список всех методов класса. Использовать еще одну какую-то библиотеку для предварительного анализа списка методов не хочется, не красиво как-то.
Есть ли способ решить это через asm?
Если вы можете загрузить класс (через Class.forName(), например), то можно воспользоваться методом getDeclaredMethod(), обернув вызов в try/catch и ловить NoSuchMethodException, в случае если искомый метод не найден. Этот функционал идет "из коробки" в JDK, никаких дополнительных библиотек не нужно.
Я думал об этом, но это ведь каждый класс грузить, не замедлит ли это компиляцию? Кроме того, а если класс требует какие-то импорты, которые в Maven лежат, разве плагин имеет доступ к этому всему? Я не пробовал, сразу почему-то подумал, что это не очень хороший способ, грузить все классы.
MisterParser, Какой-то overhead на загрузку классов конечно будет, но с уверенностью не могу сказать на сколько это замедлит Вашу обфускацию. У меня на проекте есть такой шаг при сборке, в котором проверяется как раз таки загрузка классов по Class.forName(), и работает это очень быстро при наличии 6K+ классов в проекте. Надо делать замеры. Опять же, не совсем понятен scope Вашей задачи. Вы после того, как код скомпилировался, обходите уже скомпилированные классы, и обфусцируете байт-код, так? Делаю такой вывод из-за использования asm.
Теперь по поводу зависимостей. Ну при компиляции они все должны быть удовлетворены, иначе не скомпилируется весь код, так? По этому, тут не должно быть проблем.