Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg
Post #1658
2.48K
Аннотации в конструкторах Java . декларации и типы
В языке программирования Java можно аннотировать конструкторы. Например, это часто используется в библиотеках для внедрения зависимостей :
В этом примере
🔸Аннотации деклараций и конструкторы
В этом посте нас не интересуют сами DI-библиотеки — важно лишь то, что аннотацию
Если взглянуть на определение аннотации
Здесь в
🔸Аннотации типов и конструкторы
До недавнего времени я даже не знал, что конструкторы в Java можно аннотировать также и аннотациями типов. Я много раз просматривал конструкторы, но всё равно упускал, что тип конструктора тоже может быть аннотирован.
Пример — создадим следующую аннотацию:
Это аннотация
Теперь применим её к конструктору:
Код компилируется без ошибок. Обрати внимание: класс
🔸Извлечение аннотации во время выполнения
Для полноты картины — пример, как извлечь аннотацию типа с конструктора во время выполнения:
Пошагово:
1. Получаем объект
2. Через
3. Из
4. Печатаем аннотации
Пример вывода:
То есть конструктор действительно аннотирован аннотацией типа
В языке программирования Java тело конструктора не должно содержать операторов
Таким образом, в объявлении конструктора присутствует использование типа — типа создаваемого объекта. А в Java можно аннотировать любое использование типа. Такие аннотации называются аннотациями типа
Исходный код, использованный в этом посте, можно найти в этом [Gist]
👉 Java Portal
В языке программирования 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 для конструктора класса Subject2. Через
getAnnotatedReturnType() получаем AnnotatedType, представляющий тип возвращаемого значения конструктора3. Из
AnnotatedType извлекаем все аннотации типа4. Печатаем аннотации
Пример вывода:
Type annotations are:
@TypeAnnotations2.T()
То есть конструктор действительно аннотирован аннотацией типа
@T.В языке программирования Java тело конструктора не должно содержать операторов
return с возвращаемым значением. Однако, подобно методу, возвращающему, скажем, объект Foo, конструктор тоже возвращает значение. Результатом вызова конструктора (если он завершается без исключений) является новый экземпляр объекта, тип которого — это тип класса, в котором объявлен данный конструктор.Таким образом, в объявлении конструктора присутствует использование типа — типа создаваемого объекта. А в Java можно аннотировать любое использование типа. Такие аннотации называются аннотациями типа
Исходный код, использованный в этом посте, можно найти в этом [Gist]
👉 Java Portal
- ❤ 7
- 🔥 2
- 🤔 2
















