Как можно определить, является ли локальная переменная «окончательной» из байт-кода Java? (Связано с BCEL)

#java #bytecode #bcel

#java #байт-код #bcel

Вопрос:

Где хранится информация, например, является ли локальная переменная «окончательной» в байт-коде Java? Я знаю, что для полей (глобальных переменных) и методов они находятся в битах флага доступа, но, похоже, не могут найти эквивалент в таблице локальных переменных.

Меня интересует этот вопрос, поскольку я использую BCEL для проверки того, является ли локальная переменная окончательной, и нашел эквивалент для полей, методов и классов в классе AccessFlags .

Заранее спасибо.

Ответ №1:

Окончательность локальных переменных проверяется компилятором и не попадает в байт-код. Эта информация не требуется во время выполнения и, следовательно, не сохраняется в байт-коде.

JVM обрабатывает конечные и не конечные локальные переменные одинаково.

Комментарии:

1. Я понимаю, но почему это не так и для глобальных переменных, пожалуйста?

2. Потому что глобальные переменные могут быть повторно использованы в других классах и / или программах. Когда компилятор компилирует класс, используя вашу конечную переменную, он должен знать это

3. Спасибо, теперь это имеет смысл

Ответ №2:

Короткий ответ — вы не можете. Флаг доступа «final» для локальных переменных только сообщает компилятору, что значение переменной не может быть переназначено. См. Раздел 4.7.13 спецификации JVM.

Ответ №3:

Я не верю, что вы можете определить значение final локальной переменной; это можно доказать, написав небольшой метод с final ключевым словом и без него и сравнив байт-код.