Пакет java.lang.classfile.instruction
Предоставляет интерфейсы, описывающие инструкции кода для библиотеки java.lang.classfile.
Пакет java.lang.classfile.instruction содержит интерфейсы, описывающие инструкции кода. Реализации этих интерфейсов неизменяемы. Если не указано иное, передача null или массива либо коллекции, содержащих элемент null, в качестве аргумента конструктору или методу любого класса или интерфейса Class-File API приведёт к выбрасыванию NullPointerException.
Чтение инструкций
К инструкциям и псевдоинструкциям обычно обращаются черезCodeModel, например CodeModel::forEach, и классифицируют с помощью сопоставления с образцом. При чтении файлов class инструкции загружаются лениво; содержимое этих инструкций, помимо их базовой структуры, не вычисляется, чтобы ускорить разбор. Содержимое интересующих пользователей инструкций, например отфильтрованных с помощью сопоставления с образцом, считывается по запросу, чтобы избежать ненужного чтения не связанных с ними инструкций в массиве кода.
Из-за ленивого характера разбора файлов class исключение IllegalArgumentException, указывающее на некорректные данные файла class, может быть выброшено при вызове любого метода. Например, объект инструкции для TypeCheckInstruction может быть получен из CodeModel, но последующий вызов .type() может завершиться ошибкой IllegalArgumentException, поскольку инструкция ссылается на неверный индекс пула констант.
Запись инструкций
Запись инструкций выполняется с помощьюCodeBuilder. Самый простой способ записать инструкции — передать объект инструкции в CodeBuilder::with, который поддерживает все допустимые инструкции. Однако CodeBuilder предоставляет множество вспомогательных методов-фабрик для удобного создания инструкций, названных по их мнемонике. Эти методы доступа лаконичнее и зачастую эффективнее во время выполнения, чем передача объектов инструкций. Из-за ограничений формата файла class некоторые инструкции могут быть непредставимы в CodeBuilder. В некоторых случаях, например для BranchInstruction, параметры Class-File API управляют тем, могут ли вместо них использоваться альтернативы при генерации кода. В противном случае их можно настроить на немедленное завершение с ошибкой, чтобы обеспечить соответствие команд CodeBuilder данным сгенерированного массива code.
- См. Спецификацию виртуальной машины Java:
- 6.5 Инструкции
- Начиная с версии:
- 24
| Класс | Описание |
|---|---|
| ArrayLoadInstruction | Моделирует инструкцию загрузки из массива в массиве code атрибута Code. |
| ArrayStoreInstruction | Моделирует инструкцию сохранения в массив в массиве code атрибута Code. |
| BranchInstruction | Моделирует инструкцию перехода (условного или безусловного) в массиве
code атрибута Code. |
| CharacterRange | Псевдоинструкция, моделирующая одну запись в атрибуте CharacterRangeTable. |
| ConstantInstruction | Моделирует инструкцию загрузки константы в массиве code атрибута
Code, включая инструкции констант «intrinsic», «argument» и «load». |
| ConstantInstruction.ArgumentConstantInstruction | Моделирует инструкцию «константа-аргумент», которая кодирует значение константы непосредственно в инструкции. |
| ConstantInstruction.IntrinsicConstantInstruction | Моделирует инструкцию «встроенная константа», которая кодирует значение константы в своём коде операции. |
| ConstantInstruction.LoadConstantInstruction | Моделирует инструкцию «загрузка константы», которая кодирует значение константы в пуле констант. |
| ConvertInstruction | |
| DiscontinuedInstruction | Маркерный интерфейс для инструкции, исключённой из массива code атрибута Code. |
| DiscontinuedInstruction.JsrInstruction | |
| DiscontinuedInstruction.RetInstruction | |
| ExceptionCatch | Псевдоинструкция, моделирующая запись в массиве exception_table атрибута Code. |
| FieldInstruction | Моделирует инструкцию доступа к полю в массиве code атрибута Code. |
| IncrementInstruction | Моделирует инструкцию увеличения локальной переменной в массиве code атрибута Code. |
| InvokeDynamicInstruction | Моделирует инструкцию вызова динамически вычисляемой точки вызова в массиве code атрибута Code. |
| InvokeInstruction | |
| LabelTarget | Псевдоинструкция, указывающая, что указанная метка соответствует текущей позиции в атрибуте Code. |
| LineNumber | Псевдоинструкция, указывающая, что код для заданного номера строки начинается после текущей позиции в атрибуте Code. |
| LoadInstruction | Моделирует инструкцию загрузки локальной переменной в массиве code атрибута Code. |
| LocalVariable | Псевдоинструкция, моделирующая одну запись в атрибуте LocalVariableTable. |
| LocalVariableType | Псевдоинструкция, моделирующая одну запись в атрибуте LocalVariableTypeTable. |
| LookupSwitchInstruction | |
| MonitorInstruction | |
| NewMultiArrayInstruction | |
| NewObjectInstruction | |
| NewPrimitiveArrayInstruction | |
| NewReferenceArrayInstruction | |
| NopInstruction | |
| OperatorInstruction | Моделирует инструкцию арифметического оператора в массиве code атрибута Code. |
| ReturnInstruction | Моделирует инструкцию возврата из метода в массиве code атрибута Code. |
| StackInstruction | Моделирует инструкцию манипулирования стеком в массиве code атрибута Code. |
| StoreInstruction | Моделирует инструкцию сохранения локальной переменной в массиве code атрибута Code. |
| SwitchCase | Моделирует один вариант в инструкции lookupswitch или tableswitch. |
| TableSwitchInstruction | |
| ThrowInstruction | |
| TypeCheckInstruction |
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/classfile/instruction/package-summary.html