Почему объявление локальной переменной для «this» в байт-коде декомпилированного конструктора? - PullRequest
0 голосов
/ 18 февраля 2020

Руководство пользователя ASM 4.0 описывает байт-код для конструктора publi c по умолчанию:

ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN

Я хотел скопировать это, создал свой собственный класс с конструктором publi c по умолчанию, и декомпилировал это. Хотя сгенерированный байт-код для конструктора выглядит следующим образом:

L0
 LINENUMBER 3 L0
 ALOAD 0
 INVOKESPECIAL java/lang/Object.<init> ()V
 RETURN
L1
 LOCALVARIABLE this Lcom/example/EmptyFixture; L0 L1 0
 MAXSTACK = 1
 MAXLOCALS = 1

Насколько я понимаю, все, что вложено в метку L0, которая соответствует руководству пользователя, выполняется. После RETURN имеется недостижимый код, вложенный под меткой L1, которая является просто объявлением локальной переменной this с типом класса.

Для чего нужно включать это объявление переменной ? Для чего он используется, тем более что он выглядит недоступным?

1 Ответ

1 голос
/ 18 февраля 2020

Информация после L1 носит описательный характер; это не код и его нельзя выполнить, поэтому его «достижимость» не имеет смысла. Другими словами, даже если поток управления каким-то образом достигнет L1, эти строки не будут выполнены, и если бы они были помещены в исполняемый код, в данном случае между L0 и L1, они все равно не были бы выполнены.

Как и директива LINENUMBER, эти строки определяют информацию об отладке, которая находится в файле класса. Отладочная информация включена в файл классов для поддержки отладки и используется отладчиком при отладке.

...