@iskateli

Меняют ли аннотации данные в коде?

Читаю Брюса Эккеля "Философия Java", раздел про аннотации, где говорится, что аннотации сами по себе и мы ими или отмечаем что либо в коде или храним в них дополнительную информацию которая на код никак не влияет. И тут внезапно на странице 857 говорится
Свойства firstName и lastName снабжаются аннотациями
@ SQLString и получают значения 30 и 50 соответственно.

Полный пример кода:
//:annotations/database/SQLString.java
package annotations.database;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString{
intvalue() default 0;
Stringname() default "";
Constraints constraints() default @Constraints;
}///

//:annotations/database/Member.java
package annotations.database;
@DBTable(name="MEMBER")
public class Member{
@SQLString(30) String firstName;
@SQLString(50) String lastName;
@SQLInteger Integer age;
@SQLString(value=30,
constraints = @Constraints(primaryKey=true))
String handle;
static int memberCount;
public String getHandle(){return handle;}
public String getFirstName(){return firstName;}
public String getLastName(){return lastName;}
public String toString(){return handle;}
public Integer getAge(){return age;}
}///:~

откуда они их получают? Из аннотаций? Это аннотации устанавливают значения? В общем очень тяжело эта глава написана у Эккеля, обратился к Герберту Шилдту "Java. Полное руководство", прочёл аналогичную главу про аннотации, обратил внимание на вот это выражение
В языке Java имеется языковое средство, позволяющее встраивать справочную информацию в исходные файлы. Эта информация называется аннотацией и не меняет порядок выполнения программы. Это означает, что аннотация сохраняет
неизменной семантику программы.
Но у Эккеля аннотации меняют значения в коде программы, а это может влиять на порядок выполнения программы, я что-то совсем запутался, поясните пожалуйста.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Давайте по порядку.

Что такое аннотация? Аннотация - это некоторые произвольные метаданные, которые программист может присоединить к некоторому объекту. И только. Данные, ничего кроме. Никакого поведения сама по себе аннотация не добавляет.

То есть аннотация ничего не делает? Да, именно так. Сама по себе аннотация ничего не делает.

Тогда зачем она вообще нужна? Для того чтобы аннотация оказала какое-то влияние на программу нужен процессор аннотаций. Процессор аннотаций бывает двух видов: первый работает во время компиляции программы. И аннотации оказывают влияние именно на процесс компиляции. Это может повлиять на итоговой код программы, либо изменить логику работы компилятора, например, добавить какие-то дополнительные проверки.

Второй вид процессоров аннотаций работает во время выполнения программы. Через механизм рефлексии он анализирует аннотации, которые добавил программист, и выполняет логику в соответствии с аннотации и содержащимися в них даннми. Так, например, работает Spring, который в соответствии с аннотациями @Service, @Scope, @Autowired, @Controller и т.п. инициализирует компоненты приложения и запускает его в нужной конфигурации.

У Эккеля написано неточно (либо это неточный перевод, такое тоже часто бывает). Переменные никакого значения не получают, получает значение поле в аннотации (аннотация в Java - это тоже объект и тоже имеет поля). А затем уже процессор аннотаций значение этого поля как-то использует (в приведенном примере - устанавливает соответствие с колонкой в таблице базы данных соответствующего типа и, при необходимости, создает её).

У Шилдта написано корректнее - сами по себе аннотации никак семантику программы не затрагивают, для того чтобы они заработали требуется дополнительный код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Сами по себе аннотации ничего не меняют. Если написать Member member = new Member() то поле firstName экземпляра member будет равно null, а не 30. Нужен какой-то ещё код, который обработает аннотации и в соответствии с ними выполнит какие-либо действия. Обычно обрабатывают аннотации фреймворки, компилятор или его плагины.
Ответ написан
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
В первую очередь, наверное, стоит обратить внимание на это:
Аннотации представляют собой некие метаданные, которые могут добавлятся в исходный код программы и семантически не влияют на нее, но могут использоваться в процессе анализа кода, компиляции и даже во время выполнения.

Далее обратите внимание на RetentionPolicy:

RetentionPolicy.SOURCE - аннотация используется на этапе компиляции и должна отбрасываться компилятором;
RetentionPolicy.CLASS - аннтоация будет записана в class-файл компилятором, но не должна быть доступна во время выполнения (runtime);
RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через reflection.


Чтобы аннотация "заработала" нужен так называемый Analyzer (Processor)
Вот, пример процессора:
https://www.baeldung.com/java-annotation-processin...
https://thetechstack.net/how-to-process-annotation...
https://cloudogu.com/en/blog/Java-Annotation-Proce...

@SQLString(30) String firstName;
Процессор при помощи рефлексии получит доступ к экземпляру данного класса, затем прочитав данные указанные в аннотации создаст соответсвующую таблицу с соответствующими колонками согласно указанным аннотациям
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
01 мая 2024, в 16:45
120000 руб./за проект
01 мая 2024, в 15:48
18000 руб./за проект
01 мая 2024, в 15:17
500 руб./в час