#java #bytecode-manipulation #byte-buddy #jvm-bytecode
#java #манипулирование байт-кодом #байт-приятель #jvm-байт-код
Вопрос:
Согласно [1], во фрейме метода массив локальных переменных содержит ссылку на вызываемый экземпляр, параметры и, наконец, любые другие переменные, используемые в коде метода. Кроме того, long
и double
значения занимают две локальные переменные.
При использовании Byte Buddy для генерации кода метода с помощью манипуляций со стеком MethodVariableAccess.OffsetLoading
индекс long
и double
значения объединяются в один индекс или это необходимо, как при непосредственном использовании ASM, для учета таких значений для вычисления локального индекса var?
[1] https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.6.1
Ответ №1:
MethodVariableAccess.OffsetLoading
обращается к смещению, которое не называется индексом, чтобы отличить именно это. Если long
double
в массиве содержится тип или, это относится к двум слотам. Byte Buddy использует эту абстракцию для взаимодействия с ASM, где для вызова соответствующего посетителя требуется такое же смещение.