2.1 - Формат
2.2 - Сигнатуры
2.3 - Константный пул
2.4 - Поля
2.5 - Методы
2.6 - Атрибуты
Эта глава описывает формат файла класса (.class) языка Ява.
Каждый файл класса содержит откомпилированную версию или класса языка Ява, или интерфейса языка Ява. Корректные интерпретаторы языка Ява должны быть способны иметь дело с любыми файлами класса, которые соответствуют нижеследующим спецификациям.
Файл класса языка Ява состоит из последовательности 8-битовых байт. Все 16-битные и 32-битные элементы конструируются в виде двух или четырех 8-битовых байт, соответственно. Байты соединяются вместе в порядке, принятом в сетях, когда старшие байты приходят первыми. Этот формат поддерживается в языке Ява интерфейсами java.io.DataInput и java.io.DataOutput и классами, такими как java.io.DataInputStream и java.io.DataOutputStream.
Формат файла классов описывается с использованием структурной нотации. Последующие поля структуры появляются во внешнем представлении без заполнения или выравнивания. Массивы переменного размера, чаще с элементами переменного размера называются таблицами и занимают общее место в таких структурах.
Типы u1, u2, and u4 обозначают беззнаковые одно-, двух- или четырех-байтовые величины, соответственно, которые читают с помощью метода readUnsignedByte,readUnsignedShort и readInt из интерфейса java.io.DataInput.
Следующая псевдо-структура дает высокоуровневое представление формата файла
класса:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count - 1];
u2 access_flags; u2 this_class; u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count; field_info fields[fields_count];
u2 methods_count; method_info methods[methods_count];
u2 attributes_count; attribute_info attributes[attribute_count];
}
Это поле имеет значение 0xCAFEBABE.
Эти поля указывают на номер версии компилятора языка Ява, которым был создан этот файл класса. Реализация виртуальной машины языка Ява будет совместима с номерами от 0 до n низшей версии из множества чисел высшей версии. Если номер низшей версии увеличивается, то старая виртуальная машина не сможет работать с ее новым кодом, но есть возможность создать новую виртуальную машину, которая будет работать с версиями вплоть до n+1.
{A change of the major version number indicates a major incompatible change, one that requires a different virtual machine that may not support the old
major version in any way.!
Номер текущей высшей версии 45, текущей низшей версии 3.
constant_pool_count;
Это поле означает число записей в константном пуле файла классов.
constant_pool
Константный пул - это таблица значений. Эти значения являются различными строковыми константами, именами классов, именами полей и другими, которые обозначены структурой класса или кодом.
constant_pool[0] никогда не используется компилятором, и может быть использован в некоторых целях реализацией.
Все элементы constant_pool вводят 1 через constant_pool_count-1 — это элемент переменной длины, имеющий формат, получаемый с помощью первого "tag" байта, который описывается в пункте 2.3.
access_flags
Это поле включает трафарет до 16 модификаций, используемых в описаниях классов, методов и полей. То же кодирование используется в подобных полях field_info и method_info, описанных выше. Представление:
Flag Name | Значение | Описание | Где использовался |
ACC_PUBLIC | 0x0001 |
Видимый для всех | Класс, Метод, Переменная |
ACC_PRIVATE | 0x0002 |
Видимый только для определяемого класса | Метод, Переменная |
ACC_PROTECTED | 0x0004 |
Видимый для подклассов | Метод, Переменная |
ACC_STATIC | 0x0008 |
Переменная или метод статические | Метод, Переменная |
ACC_FINAL | 0x0010 |
Нет дальнейшей подкласификации, обхода или присваивания после инициализации | Класс, Метод, Переменная |
ACC_SYNCHRONIZED | 0x0020 |
Использует возврат в блокировке монитора | Метод |
ACC_VOLATILE | 0x0040 |
Не может помещать в кеш | Переменная |
ACC_TRANSIENT | 0x0080 |
Не может боть написан или прочитан постоянным объектом управления | Перемення |
ACC_NATIVE | 0x0100 |
Реализован в других языках | Метод |
ACC_INTERFACE | 0x0200 |
интерфейс | Класс |
ACC_ABSTRACT | 0x0400 |
Ничего не предусматривает | Класс, Метод |
this_class
Это поле-индекс в константном пуле; constant_pool[this_class] должен быть CONSTANT_class.
super_class
Это поле-индекс в константном пуле. Если значение super_class не равно нолю, то constant_pool[super_class] должен быть классом, и представляет индех суперкласса класса в константном пуле.
Если значение super_class равно нолю, то класс должен быть java.lang.Object, и он не имеет суперкласса.
interfaces_count
Это поле дает число интерфейсов, которые этот класс реализует.
interfaces
Каждое значение этой таблицы является индексом в константном пуле. Если табличное значение не равно нулю (interfaces[i] != 0, где 0 <= i < interfaces_count), то constant_pool[interfaces[i]] должен быть интерфейсом, который реализуется этим классом.
Вопрос: Может ли хоть одно из вхождений быть 0?
fields_count
Это поле содержит число переменных, как статических так и динамических, определяемых этим классом. Таблица полей включает только те переменные, которые четко определяются этим классом. Она не включает те тех переменных, которые доступны этому классу, но унаследованы из суперклассов.
fields
Каждое значение в таблице-полностью завершенное описание поля класса. Смотри пункт 2.4 для более полной информации о field_info структуре.
methods_count
Это поле показывает общее число методов, как статических так и динамических, определяемых этим классом. Эта таблица включает только те методы, которые определяются этим классом. Она не включает унаследованные методы.
methods
Каждое значение в таблице-завершенное описание метода в классе. Смотри пункт 2.5 для полной информации о method_info структуре.
attributes_count
Это поле показывает число дополнительных аттрибутов этого класса.
attributes
Класс может иметь несколько необязательных аттрибутов связанных с ним. Считается, что только аттрибут класса признается как атрибут "SourceFile" , который обозначает имя файла источника, из которого формируется этот файл класса. Смотри пункт 2.6 для более полной информации о attribute_info структуре.
Сигнатура — это строка, задающая тип метода, поля или массива.
Сигнатура поля определяет значение аргумента функции или значение переменной. Это последовательность байт, порождаемых следующей грамматикой:
< сигнатура_поля > ::= < тип_поля >
< тип_поля > ::= < базовый_тип >|< объектный_тип >|< тип_массив >
< базовый_тип > ::= B|C|D|F|I|J|S|Z
< объектный_тип > ::= L< полное имя класса>;
< тип массив > ::= [< необязательный_размер >< тип_поля >
< необязательный_размер > ::= [0-9]*
Обозначения базовых типов следующие:
B byte знаковый байт
C char символьный
D double вещественный двойной точности стандарта IEEE
F float вещественный обычной точности стандарта IEEE
I int целый
J long длинный целый
L<fullclassname>; ... объект данного класса
S short короткий целый со знаком
Z boolean true или false
[<field sig> ... Массив
Сигнатура возвращаемого типа представляет значение, возвращаемое методом. Это последовательность байт в следующей грамматике:
< сигнатура_возврата > ::= < тип_поля > | V
Буква V означает, что метод не возвращает значения. В противном случае, сигнатура указывает тип возвращаемого значения.
Сигнатура аргумента определяет аргумент вызываемого метода:
< сигнатура аргумента > ::= < тип_поля >
Сигнатура метода определяет аргументы этого метода, а также возвращаемое значение .
< сигнатура_метода > ::= (< сигнатура_аргументов >) < сигнатура_возврата >
< сигнатура_аргументов>: := < сигнатура_аргумента >*
Все элементы константного пула начинаются с байта тега.
Таблица, преставленная ниже, содержит перечень тегов и их значений:
Тип константы |
Значение |
CONSTANT_Class | 7 |
CONSTANT_Fieldref | 9 |
CONSTANT_Methodref | 10 |
CONSTANT_InterfaceMethodref | 11 |
CONSTANT_String | 8 |
CONSTANT_Integer | 3 |
CONSTANT_Float | 4 |
CONSTANT_Long | 5 |
CONSTANT_Double | 6 |
CONSTANT_NameAndType | 12 |
CONSTANT_Utf8 | 1 |
CONSTANT_Unicode | 2 |
Каждый байт тега-это один или несколько следующих байт, дающих информацию о специфике констант.
CONSTANT_Class
CONSTANT_Class используется для представления класса или интерфейса.
CONSTANT_Class_info {
u1 tag;
u2 name_index;
}
tag
тег будет иметь значение CONSTANT_Class
name_index
constant_pool [name_index] это CONSTANT_Utf8, дающий строку имени класса.
Поскольку массивы – это объекты, операции anewarray и multianewarray могут ссылаться на “классы” массивов посредством элемента CONSTANT_Class в константном пуле. В этом случае, имя класса является сигнатурой. Например, имя класса
int[][]
это
[[I
Имя класса
Thread[]
это
"[Ljava.lang.Thread; "
CONSTANT_{Fieldref,Methodref,InterfaceMethodref}
Поля, методы и интерфейсные методы представляются следующей подобной структурой.
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_Methodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
tag
Тег будет иметь значение CONSTANT_Fieldref, CONSTANT_Methodref, или CONSTANT_InterfaceMethodref.
class_index
constant_pool [class_index] должна быть элементом типа CONSTANT_Class, дающей имя класса или интерфейса, содержащего поле или метод.
Для CONSTANT_Fieldref и CONSTANT_Methodref, CONSTANT_Class элемент должен быть фактическим классом. Для CONSTANT_InterfaceMethodref, элемент должен быть интерфейсом, который подразумевает реализацию метода.
name_and_type_index
constant_pool [name_and_type_index] должна быть CONSTANT_NameAndType. Эта составляющая константного пула указывает на имя и сигнатуру поля или метода.
CONSTANT_String
CONSTANT_String используется для представления объектов встроенного строкового типа (String)
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
tag
Тег будет иметь значение СONSTANT
string_index
constant_pool [string_index] -это CONSTANT_Utf8 строка, дающая значение, которое инициализирует объект типа String.
CONSTANT_Integer and CONSTANT_Float
CONSTANT_Integer и CONSTANT_Float представляют собой четырехбайтовые константы.
CONSTANT_Integer_info {
u1 tag;
u4 bytes;
}
CONSTANT_Float_info {
u1 tag;
u4 bytes;
}
tag
тег будет иметь значение CONSTANT_Integer или CONSTANT_Float.
bytes
Для целых, четыре байта-целые значения. Для вещественных, в стандарте IEEE 754 они- число с плавающей точкой. Эти байты располагаются по возрастанию (первым старший байт ).
CONSTANT_Long и CONSTANT_Double
CONSTANT_Long и CONSTANT_Double представляют собой 8-байтовые константы.
CONSTANT_Long_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
CONSTANT_Double_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
Все 8-байтовые константы занимают по два места в константном пуле. Если это n-ый элемент константного пула, то следующий будет находиться на n+2 месте.
tag
Тег будет иметь значение CONSTANT_Long или CONSTANT_Double.
high_bytes, low_bytes
Для CONSTANT_Long, 64-битовое значение это есть - (high_bytes << 32) + low_bytes.
Для CONSTANT_Double, 64-битовое значение это есть high_bytes и low_bytes вместе представленые в стандарте IEEE 754, как двойные вещественные с плавающей точкой.
CONSTANT_NameAndType
CONSTANT_NameAndType используется для представления поля или метода без указания принадлежности классу.
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 signature_index;
}
tag
Тег будет принимать значение CONSTANT_NameAndType.
name_index
constant_pool [name_index] - это CONSTANT_Utf8 строка, дающая имя поля или метода.
signature_index
constant_pool [signature_index] - это CONSTANT_Utf8 строка, дающая значение сигнатуры поля или метода.
CONSTANT_Utf8 и CONSTANT_Unicode
CONSTANT_Utf8 и CONSTANT_Unicode используются для представления значений строковых констант
CONSTANT_Utf8-строки "кодируются" так, что строки, содержащие только
символы ASCII не null, могут быть представлены так, что на каждый символ приходится один байт, но могут быть представлены символы до 16 бит:
Все символы в диапазоне 0x0001 к 0x007F представлены единственным байтом:
+-+-+-+-+-+-+-+-+
|0|7 бит из данных|
+-+-+-+-+-+-+-+-+
Символ null (0x0000) и символы в диапазоне 0x0080 к 0x07FF представлены парой байт:
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|1|1|0|5 бит| |1|0|6 бит|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Символы в диапазоне 0x0800 к 0xFFFF представлены тремя байтами:
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|1|1|1|0|4 бита| |1|0|6 бит| |1|0|6 бит|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Имеются два различия между этим форматом и "стандартом" формата UTF-8. Во-первых, пустой байт 0x00 кодируется в двухбайтовый формат, больше чем однобайтовый, чтобы наши строки не имели вложенных null. Во-вторых, используются только однобайтовые, двухбайтовые и трехбайтовые форматы. Мы не рассматриваем более длинные форматы.
tag
Тег будет иметь значение CONSTANT_Utf8 или CONSTANT_Unicode.
length
Число байтов строки. Эти строки оканчиваются не на null.
bytes
Фактические байты строки.
Информация о каждом поле следует сразу за полем field_count в файле класса. Каждое поле описано структурой field_info переменной длины.
Формат этой структуры следующий:
field_info {
u2 access_flags;
u2 name_index;
u2 signature_index;
u2 attributes_count;
attribute_info attributes[attribute_count];
}
access_flags
Это - набор шестнадцати флагов, относящихся к классам, методам, и полям для описания различных свойств и какими методоми к ним можно обращаться из других классов. См. таблицу "Access Flags" на странице 12, которая указывает значение бит в этом поле.
Флаги, которые можно устанавливать для поля - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, и ACC_TRANSIENT.
В большинстве случаев один из ACC_PUBLIC, ACC_PROTECTED, и ACC_PRIVATE можно устанавливать для любого метода.
name_index
constant_pool [name_index] - это CONSTANT_Utf8 строка, которая является названием поля.
signature_index
constant_pool [signature_index] - это CONSTANT_Utf8 строка, которая является сигнатурой поля. См. секцию "Сигнатуры" для получения большей информации о сигнатурах.
attributes_count
Это значение указывает число дополнительных атрибутов этого поля.
attributes
Поле может иметь любое число необязательных атрибутов, связанных с ним. В настоящее время, единственно предусмотренный атрибут поля - "ConstantValues". Это атрибут, указывающий, что это поле - числовая константа и задает числовое значение этого поля.
Любые другие атрибуты пропускаются.
Информация для каждого метода следует сразу за полем method_count в файле поля. Каждый метод описан структурой method_info переменной длины. Эта структура имеет следующий формат:
method_info {
u2 access_flags;
u2 name_index;
u2 signature_index;
u2 attributes_count;
attribute_info attributes[attribute_count];
}
access_flags
Это набор шестнадцати флагов, используемых классами, методами, и полями для описания различных свойств и как они доступны методам из других классов. См. таблицу "Access Flags" на странице 12, на которой можно найти представление бит в этом поле.
Поля, которые можно устанавливать для метода - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, и ACC_ABSTRACT.
В случаях ACC_PUBLIC, ACC_PROTECTED, и ACC_PRIVATE можно устанавливать для любого метода.
name_index
constant_pool [name_index] - это CONSTANT_Utf8 строка, в которой указывается название метода.
signature_index
constant_pool [signature_index] - это CONSTANT_Utf8 строка, в которой указывается сигнатура поля. См. секцию "Сигнатуры" для получения большей информации о записях.
attributes_count
Это значение указывает число дополнительных признаков этого поля.
atributes
Поле может иметь любое число необязательных признаков, связанных с ним. Каждый признак имеет название, и другую дополнительную информацию. В настоящее время, распознаются атрибуты "Code" и "Exceptions", которые описывают байткоды, предназначенные для исполнения этого метода, и исключения Явы , которые могут возникать при выполнении метода, соответственно.
Любые другие признаки пропускаются.
Атрибуты используются в нескольких различных местах в формате класса. Все атрибуты имеют следующий формат:
GenericAttribute_info {
u2 attribute_name;
u4 attribute_length;
u1 info[attribute_length];
}
attribute_name - 16-битный индекс в константном пуле класса; значение constant_pool [attribute_name] - CONSTANT_Utf8 строка, в которой указывается название атрибута. Поле attribute_length указывает длину последующей информации в байтах. Эта длина не включает в себя шесть байт attribute_name и attribute_length.
В следующем тексте всякий раз при упоминании атрибутов мы указываем название ao?eaooia, которые считаются понятыми. В дальнейшем, атрибуты будут добавлены. Предполагается, что читатели файла класса пропустят и игнорируют информацию любого атрибута, который они не понимают.
SourceFile
Атрибут "SourceFile" имеет следующий формат:
SourceFile_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 sourcefile_index;
}
attribute_name_index
constant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "SourceFile".
attribute_length
Длина SourceFile_attribute должна быть 2.
sourcefile_index
constant_pool [sourcefile_index] - это CONSTANT_Utf8 строка, указывающая первоначальный файл,из которого этот файл класса компилировался.
ConstantValue
Атрибут "ConstantValue" имеет следующий формат:
ConstantValue_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 constantvalue_index;
}
attribute_name_index
сonstant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "ConstantValue".
attribute_length
Длина ConstantValue_attribute должна быть 2.
сonstantvalue_index
сonstant_pool [constantvalue_index] дает значение константы для этого поля.
Элемент константного пула должен иметь тип, соответствующий полю, как показано в следующей таблице:
long | CONSTANT_Long |
float | CONSTANT_Float |
double | CONSTANT_Double |
int, short, char, byte, boolean | CONSTANT_Integer |
Code
Атрибут "Code" имеет следующий формат:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attribute_count];
}
attribute_name_index
constant_pool [attribute_name_index] - это CONSTANT_Utf8 строка "Code".
attribute_length
Это поле указывает общую длину атрибута "Code", исключая начальные шесть байтов.
max_stack
Максимальное число элементов стека операндов, используемых при выполнении этого метода. См. другие главы в этом описании для получения большей информации о стеке операндов.
max_locals
Число слотов локальных переменных, используемых этим методом. См. другие главы в этом описании для получения большего количества информации о локальных переменных.
code_length
Число байт в коде виртуальной машины для этого метода.
code
Это фактические байты кода виртуальной машины, которые реализуют метод. Если первый байт кода выровнен на кратную четырем границу, то при считывании в память элементы операций tableswitch и tablelookup будут выровнены; см. их описание для получения большей информации по выравниванию требований.
exception_table_length
Число элементов в следующей таблице исключений.
exception_table
Каждый элемент таблицы исключений описывает одну программу-обработчик исключений в коде.
start_pc, end_pc
Два поля start_pc и end_pc указывают диапазоны в коде, в которых обработчик исключений активен. Значения обоих полей - это смещения от начала кода. start_pc включается. end_pc не включается.
handler_pc
Это поле указывает начальный адрес обработчика исключений. Значение поля-это смещение от начала кода.
catch_type
Если catch_type отличен от нуля, тогда constant_pool [catch_type] будет классом исключений, которые этот обработчик исключений перехватывает. Этот обработчик исключений должен вызываться только в том случае, если сгенерированное исключение-это элемент данного класса.
Если catch_type - нуль, то этот обработчик исключений должен вызываться для всех исключений.
attributes_count
Это поле указывает число дополнительных атрибутов кода. Атрибут "Code" может иметь атрибуты.
attributes
Атрибут "Code" может иметь любое число необязательных атрибутов связанных с ним. Каждый атрибут имеет название и другую дополнительную информацию. В настоящее время, единственные определенные атрибуты кода - "LineNumberTable" и "LocalVariableTable", оба из которых содержат отлаженную информацию.
Таблица Исключений
Эта таблица используется компиляторами, которые указывают на то, какие исключения генерировать описываемым методом:
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
attribute_name_index
constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "Exceptions".
attribute_length
Это поле указывает общую длину Exceptions_attribute, за исключением начальных шести байтов.
number_of_exceptions
Это поле указывает число элементов в следующей таблице индексов исключений.
exception_index_table
Каждое значение в этой таблице - индекс в константном пуле. Для каждого элемента таблицы (exception_index_table [i]!= 0, где 0 < = i < number_of_exceptions), constant_pool [exception_index + table[i]] – это исключение, которое надо генерировать описываемым классом.
LineNumberTable
Этот атрибут используется отладчиками и обработчиком исключений, для определения того какая часть кода виртуальной машины соответствует данному местоположению в исходном тексте. LineNumberTable_attribute имеет следующий формат:
LineNumberTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 line_number_table_length;
{ u2 start_pc;
u2 line_number;
} line_number_table[line_number_table_length];
}
Attribute_name_index
constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "LineNumberTable".
attribute_length
Это поле указывает общую длину LineNumberTable_attribute, за исключением начальных шести байтов.
line_number_table_length
Это поле указывает число элементов в следующей таблице номеров строк.
line_number_table
Каждый элемент в таблице номеров строк указывает на то, что номер строки в исходном файле изменяется в данном месте кода.
start_pc
Это поле указывает место в коде с которого начинается код для новой строки в источнике начал. source_pc << <SHOULD THAT BE start_pc? >> - смещенным от начала кода.
line_number
Номер текущей строки, которая начинается с данной позиции в файле
LocalVariableTable
Этот атрибут используется отладчиками, чтобы определить значение данной локальной переменной в ходе динамического выполнения метода. Формат LocalVariableTable_attribute следующий:
LocalVariableTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 local_variable_table_length;
{ u2 start_pc;
u2 length;
u2 name_index;
u2 signature_index;
u2 slot;
} local_variable_table[local_variable_table_length];
}
attribute_name_index
constant_pool [attribute_name_index] будет CONSTANT_Utf8 строка "LocalVariableTable".
attribute_length
Это поле указывает общую длину LineNumberTable_attribute, за исключением начальных шести байтов.
local_variable_table_length
Это поле указывает число элементов в следующей таблице локальных переменных
local_variable_table
Каждый элемент в таблице локальных переменных указывает диапазон кода в течение которого локальная переменная имеет значение. Оно также указывает где на стеке может быть найдено значение этой переменной.
start_pc, length
Данная локальная переменная будет иметь значение в коде между start_pc и start_pc + length. Эти два значения являются смещениями от начала кода.
name_index, signature_index
constant_pool [name_index] и constant_pool [signature_index] - это CONSTANT_Utf8 строки, указывающие название и сигнатуру локальной переменной.
slot
Данная переменная будет ячейкой локальной переменной в структуре метода.