Статьи

Декомпилятор Java и его недостающая документация

Если вам когда-нибудь понадобится хороший декомпилятор для Java, есть много всего . Тем не менее, я нашел тот, который плавно интегрируется с Eclipse, что, я думаю, не так распространено. Удачно названный Java Decompiler — более новый, который состоит из трех частей: библиотека ядра (JD-Core), GUI (JD-GUI) и плагин Eclipse (JD-Eclipse). Цель первых двух частей довольно очевидна. Существует базовая библиотека, которая реализует декомпилятор и приложение с графическим интерфейсом, которое вы можете использовать для просмотра декомпилированных файлов. Плагин Eclipse — самая новая и интересная часть трио, поэтому я собираюсь обсудить это здесь.

Звучит как отличный плагин, но что он делает?

Это хороший вопрос, и это естественный вопрос, когда вы ищете такую ​​вещь. Страница JD-Eclipse пытается помочь вам установить многообещающий плагин, но не рассказывает истории о том, какие функции он предлагает. Как ни странно, страница даже не объясняет, какие настройки доступны для плагина. На самом деле, даже не упоминается, что есть какие-то предпочтения (пока они существуют).

Оказывается, JD-Eclipse — довольно хороший плагин. Он тихо и эффективно обрабатывает многие варианты использования. Есть некоторые причуды с этим, но в целом это отличный инструмент, чтобы иметь вокруг. На официальном сайте JD-Eclipse отсутствует документация о том, что ожидать при использовании инструмента. Чтобы заполнить этот пробел, вот некоторые из особенностей JD-Eclipse, на которые я наткнулся до сих пор.

настройки

Панель настроек JD-Eclipse.

Две настройки плагина находятся в Window -> Preferences -> Java -> Decompiler . Настройка отображения номеров строк обманчиво очевидна. Упоминаемые «номера строк» ​​фактически являются номерами строк из файла .class. Номера строк файла .class располагаются слева от кода в столбце комментариев. Обратите внимание, что в листинге 1 первым номером является номер строки в декомпилированном исходном файле. Отключение параметра « Отображать номера строк» приведет к удалению номеров строк файла .class.

/*          */   public void setTitle(String title)
 /*          */   {
 /* 126 */     this.title = title;
 /*          */   }

 

Listing 1 - A snippet of decompiled source code.

Параметр « Отображение метаданных» полезен для продолжения. Это побуждает JD-Eclipse добавлять комментарии в конец каждого декомпилированного файла, в котором точно указывается, какой файл .class был декомпилирован, какая версия Java использовалась и какая версия JD-Core использовалась. Комментарий будет похож на листинг 2.

/ * Местоположение: C: \ eclipse-workspace \
  library.jar
  * Полное имя: com.example.SampleClass * Версия Java Class: 6 (50.0)
  * Версия JD-Core: 0.5.3
  * /

Listing 2 - The JD-Eclipse metadata from the bottom of a decompiled source file.

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

Когда и где JD-Eclipse работает для вас?

Это реальный вопрос, на который я хотел получить ответ, прежде чем установить его. Вот сценарии, с которыми я столкнулся до сих пор, когда JD-Eclipse автоматически декомпилирует код для вас. Я подчеркиваю автоматический, потому что именно поэтому JD-Eclipse является отличным инструментом. Дизайнер проделал хорошую работу, выясняя, когда вам понадобится декомпилированный код, и включил эти знания в плагин.

Открытие типа Java

Наиболее распространенный сценарий — когда вы открываете тип Java. В частности, тип, для которого исходный код отсутствует в проекте. Есть несколько способов сделать это в Eclipse, и все они приводят к открытию декомпилированного источника.

В качестве примера, давайте использовать классы JDK. Особенно, если вы используете лицензионный JDK, такой как IBM, у вас, вероятно, нет исходного кода, доступного в вашей рабочей области. Но что, если вы хотите посмотреть на реализацию метода в классе String? У вас наверняка есть скомпилированный код JDK в вашем рабочем пространстве, и JD-Eclipse может найти его и автоматически декомпилировать класс. Вот список способов, которыми я знаю, где вы можете открыть класс String в Eclipse:

  1. Используйте диалоговое окно « Открыть тип » (Ctrl + Shift + T)
  2. Используйте Enterprise Explorer , Package Explorer или Navigator view для просмотра и открытия класса String во включенной библиотеке JRE / JDK.
  3. Наведите указатель мыши на текст имени класса «String» в исходном файле и щелкните левой кнопкой мыши, чтобы открыть класс.
  4. Откройте класс String из результата поиска Java.

Я уверен, что есть другие способы открыть класс в Eclipse, но этот список охватывает наиболее распространенные сценарии. В любом случае, в результате вы можете увидеть исходный код класса String, который JD-Eclipse выполняет автоматически и беззвучно. Единственный способ, которым вы даже знаете, что JD-Eclipse был вовлечен, — это отображение значка с подписью кофейной кружки рядом с именем класса.

Декомпилированный класс java.lang.String в Eclipse с логотипом кофейной кружки JD-Eclipse.

Отладка

Этот сценарий был самым удивительным для меня. Я ожидал, что когда я открою класс без исходного кода, я получу декомпилированный исходный код, но я предположил, что на этом JD-Eclipse остановится. К счастью, декомпилятор также работает при отладке. Простой шаг в код без исходного кода приведет к включению JD-Eclipse. Отладчик с радостью отобразит декомпилированный исходный код и остановится на ожидаемой строке. Впечатляет.

Перспектива «отладки» в Eclipse. Отладчик находится в точке останова в классе String.

Когда JD-Eclipse не работает для вас?

В некоторых случаях JD-Eclipse не делает то, что я надеялся. Самый большой недостаток, который я видел до сих пор, заключается в том, что декомпилированный код не всегда корректно работает с отладчиком. У меня было несколько раз, когда отладчик ломался от бессмысленной строки, такой как закрывающая скобка. Почему это, я не могу сказать точно. Я предполагаю, что процесс компиляции и декомпиляции приводит к тому, что номера строк слегка отключаются. Возможно, это даже не вина JD-Eclipse, но это все еще неприятность.

JD-Eclipse также, по-видимому, переопределяет Eclipse, когда у вас действительно есть исходный код, подключенный к библиотеке. Даже когда вы настроили свой проект для ссылки на исходный код библиотеки, JD-Eclipse всегда побеждает и отображает декомпилированный код. В идеале JD-Eclipse должен распознавать этот параметр и позволять открывать реальный исходный код, а не вмешиваться в его декомпилированную версию.

Другой сценарий, который JD-Eclipse не охватывает, это файлы JSP. К сожалению, я еще не нашел способ декомпилировать скомпилированный JSP. Опять же, это может быть больше проблемой с Eclipse, чем JD-Eclipse.

Вывод

JD-Eclipse — отличный инструмент, если вы часто работаете в Eclipse. Что меня поразило, так это то, насколько проворно и незаметно он выполняет свою работу. В большинстве случаев он просто делает то, что вы хотите, то есть показывает исходный код. О, и я не упомянул, что это быстро. Я никогда не замечал паузу, пока JD-Eclipse декомпилируется. Источник просто открывается, как если бы он был прямо в моем проекте.

 

От http://thewonggei.wordpress.com/2011/04/15/java-decompiler-and-its-missing-documentation/