Как можно определить, является ли локальная переменная 'final' из байт-кода Java?(Относится к BCEL) - PullRequest
5 голосов
/ 09 октября 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

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

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

1 голос
/ 09 октября 2011

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

0 голосов
/ 09 октября 2011

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

...