#java #bytecode #bcel
#java #байт-код #bcel
Вопрос:
Где хранится информация, например, является ли локальная переменная «окончательной» в байт-коде Java? Я знаю, что для полей (глобальных переменных) и методов они находятся в битах флага доступа, но, похоже, не могут найти эквивалент в таблице локальных переменных.
Меня интересует этот вопрос, поскольку я использую BCEL для проверки того, является ли локальная переменная окончательной, и нашел эквивалент для полей, методов и классов в классе AccessFlags .
Заранее спасибо.
Ответ №1:
Окончательность локальных переменных проверяется компилятором и не попадает в байт-код. Эта информация не требуется во время выполнения и, следовательно, не сохраняется в байт-коде.
JVM обрабатывает конечные и не конечные локальные переменные одинаково.
Комментарии:
1. Я понимаю, но почему это не так и для глобальных переменных, пожалуйста?
2. Потому что глобальные переменные могут быть повторно использованы в других классах и / или программах. Когда компилятор компилирует класс, используя вашу конечную переменную, он должен знать это
3. Спасибо, теперь это имеет смысл
Ответ №2:
Короткий ответ — вы не можете. Флаг доступа «final» для локальных переменных только сообщает компилятору, что значение переменной не может быть переназначено. См. Раздел 4.7.13 спецификации JVM.
Ответ №3:
Я не верю, что вы можете определить значение final
локальной переменной; это можно доказать, написав небольшой метод с final
ключевым словом и без него и сравнив байт-код.