Просмотр байткода с помощью javap
Декомпилируйте class-файлы с помощью javap -c, чтобы понять, как конструкции Java преобразуются в байткод.
«Просмотр байткода с помощью javap» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем исследовать байт-код?
Понимание байт-кода показывает, как JVM на самом деле выполняет ваш код на Java. Это помогает отлаживать проблемы производительности, понимать оптимизации компилятора и проверять, что синтетический код (лямбды, внутренние классы) работает ожидаемым образом.
Базовое использование javap
javap ClassName отображает открытый API класса (сигнатуры методов, объявления полей). Он читает файл .class из текущего каталога или пути классов.
# Compile first:
javac User.java
# Display public API:
javap User
# Output:
# public class User {
# public java.lang.String getName();
# public int getAge();
# }Дизассемблирование байт-кода с помощью -c
javap -c User показывает набор инструкций JVM (коды операций) для каждого метода. Это основное представление для понимания потока выполнения.
# javap -c User
# public java.lang.String getName();
# Code:
# 0: aload_0
# 1: getfield #2 // Field name:Ljava/lang/String;
# 4: areturnПодробный вывод с помощью -v
javap -v User добавляет пул констант, флаги доступа, размеры стека и таблицу исключений — всё это необходимо для глубокого анализа и отладки ClassCastException.
# javap -v User
# Constant pool:
# #1 = Methodref #5.#22 // java/lang/Object."<init>":()V
# #2 = Fieldref #4.#23 // User.name:Ljava/lang/String;
# ...Распространённые инструкции байт-кода
Знайте наиболее часто встречающиеся коды операций: aload_0 (загрузка this), getfield, putfield, invokevirtual, invokespecial (конструкторы и закрытые методы), invokestatic, invokedynamic (лямбды), return, areturn.
Лямбды и invokedynamic
Лямбда-выражения компилируются в инструкции invokedynamic. При первом вызове LambdaMetafactory генерирует класс; последующие вызовы используют его повторно. javap -v показывает таблицу методов начальной загрузки.
// Java:
list.forEach(s -> System.out.println(s));
// Compiles to invokedynamic — javap shows:
// invokedynamic #4,0 // InvokeDynamic #0:accept:()Ljava/util/function/Consumer;Оптимизация конкатенации строк
Современный javac использует invokedynamic для "Hello " + name вместо StringBuilder. javap -v показывает метод начальной загрузки StringConcatFactory.
// Java 9+ string concat:
String s = "Hello " + name;
// Compiles to:
// invokedynamic #5,0 // InvokeDynamic #1:makeConcatWithConstantsПросмотр доступа к внутреннему классу
Когда внешний класс обращается к закрытому полю внутреннего класса (или наоборот), компилятор генерирует синтетические методы access$000. Команда javap -p (закрытые члены) показывает их.
# javap -p OuterClass
# static int access$000(OuterClass);
# -- synthetic bridge method generated by the compilerПроверка стоимости автоупаковки
Автоупаковка компилируется в вызовы Integer.valueOf() или int.intValue(). Используйте javap -c, чтобы подтвердить наличие упаковки и решить, стоит ли использовать примитивные типы.
// Java:
List<Integer> list = new ArrayList<>();
list.add(42); // autoboxing
// Bytecode:
// bipush 42
// invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;Чтение try-catch из байт-кода
Обработчики исключений представлены записями в таблице исключений, видимой с помощью javap -v. Каждая запись показывает начало try, конец try, обработчик и перехватываемый тип.
# Exception table:
# from to target type
# 2 10 15 Class java/io/IOException
# -- means: if IOException in bytes 2-10, jump to handler at byte 15Заголовок файла класса
Заголовок файла класса содержит магическое число (CAFEBABE), старшую и младшую версии, а также флаги доступа. javap -v показывает старшую версию, которая соответствует выпуску Java, скомпилировавшему класс.
# javap -v User
# minor version: 0
# major version: 61 <- Java 17
# flags: ACC_PUBLIC, ACC_SUPERБыстрая проверка
Какой флаг javap показывает коды операций JVM для каждого метода?
Итоги
Используйте javap -c для просмотра кодов операций, а javap -v — для полной информации. Знайте ключевые коды операций: invokevirtual, invokespecial, invokedynamic, getfield. Исследуйте лямбды, упаковку и конкатенацию строк, чтобы понять результат работы компилятора.
Часто задаваемые вопросы
Урок «Просмотр байткода с помощью javap» бесплатный?
Да — полный текст урока «Просмотр байткода с помощью javap» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Просмотр байткода с помощью javap»?
Декомпилируйте class-файлы с помощью javap -c, чтобы понять, как конструкции Java преобразуются в байткод. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Просмотр байткода с помощью javap»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Этапы загрузки классов: загрузка, связывание, инициализация
- Иерархия ClassLoader и пользовательские загрузчики
- Просмотр байткода с помощью javap
- JIT-компиляция и многоуровневая компиляция