Почему значение атрибута аннотации должно быть постоянным?

У меня есть следующий фрагмент кода

 @UIUnitTimeout(8*60*1000) // works
 @UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work

Я знаю, что в соответствии с JLS в качестве значений атрибутов аннотации допускаются только постоянные выражения. Но почему? Почему этого недостаточно, если типы данных совпадают? Есть ли что-то, что может пойти не так, если выражения должны быть оценены во время выполнения? Есть ли у каждой спецификации логические соображения?

Ответ 1

Аннотации напоминают расширение типа или метаданные о типе.

Поскольку java является статически типизированным языком (это означает, что типы известны во время компиляции), представляется разумным, что данные атрибута атрибутов (метаданные) также известны во время компиляции - вы определяете/объявляете данные об аннотации (расширение).

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

Ответ 2

Предварительная обработка аннотации требует указания значения аннотации перед выполнением аннотированного кода. Кроме того, определения аннотаций сами по себе нотифицированы с помощью @Retention, которая имеет значение RetentionPolicy (если не указано, по умолчанию используется CLASS).

Поэтому есть три разных "вида" аннотаций, и только те аннотации, объявленные как RUNTIME, будут доступны, когда программа будет выполнена. (Но их значение должно быть постоянным, чтобы они оставались определенными без выполнения связанного кода.)

КЛАСС. Аннотации должны быть записаны в файле класса компилятором но не нужно сохранять VM во время выполнения.

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

SOURCE Аннотации должны быть отброшены компилятором.

.