TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1658 2.48K
Аннотации в конструкторах Java . декларации и типы

В языке программирования Java можно аннотировать конструкторы. Например, это часто используется в библиотеках для внедрения зависимостей :

@Inject
MyService(FooProcessor processor, BarLogger logger) {
this.processor = processor;
this.logger = logger;
}


В этом примере MyService — это конструктор некоего сервиса, и он помечен аннотацией @Inject. Эта аннотация сообщает DI-библиотеке, что нужно использовать именно этот конструктор для создания экземпляра сервиса.

🔸Аннотации деклараций и конструкторы

В этом посте нас не интересуют сами DI-библиотеки — важно лишь то, что аннотацию @Inject можно ставить на уровне декларации конструктора.

Если взглянуть на определение аннотации @Inject, то оно будет примерно таким:

@Target({METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
public @interface Inject {}


Здесь в @Target указано CONSTRUCTOR, что означает, что аннотацию можно применять к конструкторам. Так как @Inject применяется к декларациям, её называют аннотацией декларации

🔸Аннотации типов и конструкторы

До недавнего времени я даже не знал, что конструкторы в Java можно аннотировать также и аннотациями типов. Я много раз просматривал конструкторы, но всё равно упускал, что тип конструктора тоже может быть аннотирован.

Пример — создадим следующую аннотацию:

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface T {}


Это аннотация @T, которая применяется только к типам (TYPE_USE). Также указана политика RUNTIME, чтобы можно было получить доступ к аннотации во время выполнения.

Теперь применим её к конструктору:

static class Subject {
public @T Subject() {}
}


Код компилируется без ошибок. Обрати внимание: класс Subject — вложенный (static class), не inner, поэтому используется модификатор static.

🔸Извлечение аннотации во время выполнения

Для полноты картины — пример, как извлечь аннотацию типа с конструктора во время выполнения:

void main() throws NoSuchMethodException {
final Class<?> type = Subject.class;

final Constructor<?> constructor = type.getDeclaredConstructor();

final AnnotatedType annotatedType = constructor.getAnnotatedReturnType();

final Annotation[] typeAnnotations = annotatedType.getDeclaredAnnotations();

print("Type annotations are:", typeAnnotations);
}

private void print(String msg, Annotation[] annotations) {
System.out.println(msg);
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
}


Пошагово:

1. Получаем объект Constructor для конструктора класса Subject
2. Через getAnnotatedReturnType() получаем AnnotatedType, представляющий тип возвращаемого значения конструктора
3. Из AnnotatedType извлекаем все аннотации типа
4. Печатаем аннотации

Пример вывода:

Type annotations are:
@TypeAnnotations2.T()


То есть конструктор действительно аннотирован аннотацией типа @T.

В языке программирования Java тело конструктора не должно содержать операторов return с возвращаемым значением. Однако, подобно методу, возвращающему, скажем, объект Foo, конструктор тоже возвращает значение. Результатом вызова конструктора (если он завершается без исключений) является новый экземпляр объекта, тип которого — это тип класса, в котором объявлен данный конструктор.

Таким образом, в объявлении конструктора присутствует использование типа — типа создаваемого объекта. А в Java можно аннотировать любое использование типа. Такие аннотации называются аннотациями типа

Исходный код, использованный в этом посте, можно найти в этом [Gist]

👉 Java Portal
  • ❤ 7
  • 🔥 2
  • 🤔 2
More from @java_iibrary
  1. Sep 30, 2026Docker прост, пока всё работает. Но что делать, если контейнер постоянно перезапускается,…
  2. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
  3. Sep 29, 2026Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие…
  4. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  5. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  6. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →