Аннотации в java

Для тех, кто только начал изучать язык программирования java, аннотации покажутся чем-то странным и совсем не нужным.

На первый взгляд — это так, но за аннотациями скрывается мощный инструмент, который делает программирование на JAVA еще более увлекательным.

План на сегодня:

Что такое аннотация в java?

Аннотации (annotations) — это конструкторы, которые применяются к конструкциям джава: классы, методы, поля. Они не выполняют код сами по себе, но могут использоваться компилятором или на этапе выполнения программы для выполнения определенных действий с кодом, на который они применены.

Если объяснять проще — то аннотации это вот та строка @Override, которую eclipse сам дописал, а Вы не знаете удалить ее или нет.

Вроде и когда удалил — ничего не произошло; добавил — тоже ничего. Если брать к примеру @Override, то она ничего не меняет и не выполняет. Данная аннотация является встроенной и говорит, что метод, аннотированный как Override должен переопределять метод супер класса.

Есть еще очень полезная встроенная аннотация @Deprecated. Если Вы открыли код и видите над некоторым методом данную аннотацию — это означает, что метод устарел и уже не рекомендуется к использованию. Все же выполняться код с данным методом будет, но будут показаны предупреждения компилятора. Это очень полезная и нужная аннотация. Вскоре, во время разработки больших проектов она может Вам понадобиться.

Важно понимать, что аннотации не изменяют код во время выполнения программ. Они могут изменить поведение методов или полей при своем присутствии или отсутствии. Чтобы больше понять суть аннотаций предлагаю написать одну свою.

Как создавать собственные аннотации?

Перед тем, как начать кодить нужно еще немного теории. Создание аннотаций должно включать два типа информации: политика удержания (retention policy) и цель (target).

Политика удержания будет указывать как долго будет доступна аннотация в пределах програмного цикла. Будет ли аннотация доступна только во время выполнения или во время компиляции программы. Может быть она будет доступна и во время выполнения и компиляции.

Цель аннотации — это указатель на какою конструкцию мы будет в будущем применять аннотацию. Это могут быть поля, методы, другие аннотации, локальные переменные, конструкторы и т.д.

Аннотации также могут принимать параметры: примитивы, строки, перечисления, классы, другие аннотации или массивы из вышеперечисленных типов.

Теперь, напишем аннотацию, которая будет присваивать значение переменной класса.

Создаем простой java проект: File -> New -> Java project

Для удобства создадим пакет com.javamaster.annotation_example

Далее создаем аннотацию как на гиф ниже:

create new annotation eclipse

Давайте назовем ее FieldCustomVal. В данной аннотации будет одна функция: если поле, на которое она будет навешана без значения — добавить значение по умолчанию. Вот ее код:

package com.javamaster.annotations_example;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldCustomVal {
	public String value() default "Hello there";
}

Код нашей аннотации довольно прост если Вы ознакомились с теорией выше. Мы указали Retention и Target. Также добавили value метод, который будет принимать значением строку которую мы потом присвоим полю. Если строка не задана, по умолчании будет Hello there. Далее нужно использовать аннотацию. Здесь код будет немного сложней:

package com.javamaster.annotations_example;

import java.lang.reflect.Field;

public class Main {
	
	@FieldCustomVal
	public String myFieldWithDefaultVal;
	
	@FieldCustomVal(value = "My custom val")
	public String myFieldWithCustomVal;
	
	public static void main(String[] args) throws IllegalAccessException{
		Main m = new Main();
		//тут рефлексия
		for(Field field : Main.class.getFields()) {
			FieldCustomVal fieldCustomVal = field.getAnnotation(FieldCustomVal.class);
			field.set(m, fieldCustomVal.value());
		}
		//конец рефлексии
		System.out.println(m.myFieldWithCustomVal);
		System.out.println(m.myFieldWithDefaultVal);
	}
}

Что здесь происходит? Первое: мы создали 2 поля и навешали нашу аннотацию. Как по мне — это самый очевидный и простой участок кода. Дальше в методе main мы используем рефлексию Reflection API для получения полей класса во время выполнения программы. Рефлексия — это стандартная фича языка java, которая позволяет получить доступ к классам, методам, полям программы во время выполнения.

Как Вы уже могли догадаться: результатом выполнения кода будет:

My custom val
Hello there

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

На этом пока все. Попробуйте выполнить код выше на своем компьютере. Так вникнуть намного проще.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *