Пакет java.lang.classfile.instruction
Предоставляет интерфейсы, описывающие инструкции кода для библиотеки java.lang.classfile.
Пакет java.lang.classfile.instruction содержит интерфейсы, описывающие инструкции кода. Реализации этих интерфейсов неизменяемы. API этого пакета выполняют проверки на null и недопустимые аргументы, если не указано иное.
Чтение инструкций
Инструкции и псевдоинструкции обычно доступны из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, включая инструкции констант «встроенные», «аргументные» и «загрузки». |
| 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.