Java - Почему аннотации не сохраняются при объявлении локальной переменной в файле .class? - PullRequest
0 голосов
/ 03 мая 2019

Я читаю Справочник по Java Гербер Шильдт . Я нашел заметку в одном из разделов аннотаций, которая гласит:

Аннотация в объявлении локальной переменной не сохраняется в файле .class.

Почему аннотация не сохраняется при объявлении локальной переменной в файле .class?

1 Ответ

2 голосов
/ 03 мая 2019

Чтобы получить конкретную причину, вам нужно поговорить с людьми, которые разработали эту функцию.

Однако, как общий фон, следует понимать, что на самом деле есть три различных способа обработки аннотаций в соответствии с метааннотацией RetentionPolicy (и да, я специально выбрал JavaDoc 1.5):

  • SOURCE означает, что аннотация существует только в исходном коде и вообще не записывается в файл класса. Он предназначен для аннотаций, которые изменяют поведение компилятора, но не должны иметь никакого значения для работающей программы.
  • RUNTIME означает, что аннотация записывается в файл класса таким образом, чтобы она была видна программе через отражение. Как отмечено в комментариях, вы не можете отражать локальную переменную.
  • CLASS означает, что аннотация записывается в файл класса таким образом, что невидим для программы . Однако они могут быть прочитаны анализаторами байт-кода или загрузчиками классов.

Аннотации появляются в файле класса как атрибут класса, метода или поля. Идея таблицы атрибутов, прикрепленных к этим объектам, была известна с тех пор, как был определен формат файла класса, поэтому добавить к ним аннотации было легко. Однако LocalVariableType не имеет атрибутов для каждой переменной.

Итак, я предполагаю , что архитекторы JVM решили, что преимущество аннотаций локальных переменных, зависящих только от времени загрузки, не стоит изменений в структурах данных, используемых для управления таблицей локальных переменных.

...