Декомпіляція класів на Java

1. Вступ

У цьому підручнику ми обговоримо декомпіляцію класів Java. Коли вихідний код недоступний, декомпіляція класів Java допомагає налагоджувати та розуміти поведінку вихідного коду.

Давайте розглянемо різні доступні варіанти.

2. Декомпіляція в IDE

Оскільки більшість розробок здійснюється в інтегрованому середовищі розробки (IDE), має сенс, що декомпіляція також повинна відбуватися в IDE.

Для отримання додаткової інформації про IDE, з якими ми будемо працювати, перегляньте наші статті про налагодження в Eclipse та налаштування для IntelliJ IDEA.

2.1. Затьмарення

По-перше, в Eclipse нам потрібен плагін, такий як Enhanced Class Decompiler (ECD). Цей плагін використовує п’ять різних декомпіляторів. Ми можемо встановити його з Eclipse Marketplace, а потім нам потрібно перезапустити Eclipse.

Далі ECD вимагає невеликої кількості налаштувань для зв’язування файлів класів із засобом перегляду декомпілятора класів:

Крім того, нам потрібно пов’язати файли.class без джерела”:

Нарешті, ми можемо використати декомпілятор, натиснувши Ctrl + клацніть лівою клавішею на назву класу . Ми бачимо декомпілятор, який використовується на вкладці файлу в дужках.

У цьому прикладі ми використовуємо FernFlower:

2.2. IntelliJ IDEA

На відміну від Eclipse, IntelliJ IDEA пропонує декомпілятор FernFlower за замовчуванням .

Щоб використовувати його, ми просто натискаємо клавішу Ctrl + клацніть лівою клавішею миші на назву класу та переглядаємо код:

Також ми можемо завантажити джерело. Завантажуючи джерело, ви отримаєте фактичний код та коментарі.

Наприклад, клас анотації Component із наведеного вище знімка екрану включає Javadoc щодо використання Component . Ми можемо помітити різницю:

Хоча декомпіляція дуже корисна, вона не завжди дає повну картину . Повний вихідний код дає нам повну картину.

3. Декомпіляція командного рядка

До плагінів IDE командний рядок використовувався для декомпіляції класів. Декомпілятори командного рядка також можуть бути корисні для налагодження байт-коду Java на віддаленому сервері, який не доступний за допомогою IDE або графічного інтерфейсу користувача.

Наприклад, ми можемо декомпілювати JDCommandLine за допомогою простої команди jar:

java -jar JDCommandLine.jar ${TARGET_JAR_NAME}.jar ./classes

Не залишайте параметр ./classes. Він визначає вихідний каталог.

Після успішної декомпіляції ми можемо отримати доступ до вихідних файлів, що містяться у вихідному каталозі. Тепер вони готові до перегляду за допомогою текстового редактора, такого як Vim.

4. Висновок

Ми розглянули декомпіляцію в IDE Eclipse та IntelliJ IDEA, а також параметр командного рядка, коли вони недоступні.

Ми також розглянули різницю між зв'язуванням вихідного коду та декомпіляцією.