Что такое ASM (Java Bytecode)? Объяснение библиотеки

ASM — это Java-библиотека для чтения и записи байт-кода JVM во время выполнения. Вот что она делает, как она работает и почему моды для Minecraft зависят от неё.

Librariesby trqUpdated June 4, 2026
Key takeaways
  • ASM — это Java-библиотека для чтения, изменения и записи байт-кода JVM.
  • Она работает с откомпилированными .class файлами, поэтому позволяет переписать класс без перекомпиляции.
  • Моды используют её для патчинга уже скомпилированной игры во время загрузки.
  • Большинство моддеров используют Mixin, который располагается поверх ASM и скрывает детали.

ASM — это Java-библиотека для чтения, изменения и записи байт-кода JVM. Она работает с откомпилированными файлами .class вместо исходного кода, поэтому может проверять или переписывать класс без перекомпиляции. Модификации Minecraft часто используют её, поскольку она позволяет изменять игру во время загрузки, после того как она уже скомпилирована.

Где используется Opal

Opal — это мод для Fabric, а моды Fabric проникают в код игры через этот уровень байт-кода. Вам не нужно работать с ним напрямую: скриптовый движок предоставляет вам удобный способ расширения Opal без написания байт-кода.

Что на самом деле делает ASM

ASM преобразует скомпилированный класс в нечто, что может редактировать программа. Файл .class — это всего лишь байт-код, инструкции, которые выполняет виртуальная машина Java. ASM разбирает этот байт-код, предоставляет вам методы и поля, и позволяет добавлять, удалять или изменять инструкции. Затем он записывает новый, корректный класс.

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

Как это работает

ASM читает класс с помощью ClassReader и записывает класс с помощью ClassWriter. Между этими двумя этапами ваш код посещает части класса и решает, что изменить. Существует два способа сделать это.

Подход с посетителем обрабатывает класс последовательно, элемент за элементом. Он быстрый и использует мало памяти, поскольку никогда не хранит весь класс целиком. Подход с деревом загружает класс в объекты, по которым можно свободно перемещаться и редактировать, что упрощает рассуждения при внесении больших изменений, но требует больше памяти.

ПодходКак работаетЛучше всего подходит для
API посетителяПотоковая передача событий класса по мере их чтенияНебольшие, быстрые изменения с низким потреблением памяти
API дереваСоздает редактируемую объектную модель классаБольшие или сложные переписывания

Почему моды для Minecraft это используют

Модам необходимо изменять код игры, который они не писали и не могут перекомпилировать. Игра распространяется в виде скомпилированных классов, поэтому единственный способ проникновения — на уровне байт-кода, и именно это предоставляет ASM. Мод может внедрить перехватчик в метод игры, перенаправить вызов или добавить поле, всё это при запуске.

Большинство моддеров не вызывают ASM напрямую. Они используют Mixin, высокоуровневый фреймворк, который располагается поверх ASM и преобразует простые аннотации в изменения байт-кода. Вы пишете небольшой Java-класс, описывающий изменение, а фреймворк выполняет низкоуровневую работу с ASM за вас. Моды Fabric в особенности полагаются на эту цепочку.

Когда вам может потребоваться прямой доступ к ASM

Вы редко пишете "сырой" ASM как автор мода. Это возникает, когда инструменту требуется больше контроля, чем может предоставить аннотация, например, загрузчику, обфускатору или патчеру, который переписывает классы целиком. Для обычных модов аннотационного слоя поверх достаточно, и он гораздо менее подвержен ошибкам.

Часто задаваемые вопросы