Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Custom Annotations Java: Корпоративные приложения на Spring Boot

Аннотация задаётся описанием соответствующего интерфейса с ключевым словом @interface. Саму аннотацию можно пометить несколькими аннотациями

  • Аннотация @Target указывает, что именно можно пометить этой аннотацией.
  • Аннотация @Retention указывает жизненный цикл аннотации.
  • RUNTIME указывает, что она будет видна и в процессе выполнения кода.

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

CustomAnnotation.java

@Target(value = ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// Чтобы аннотация принимала аргумент, в интерфейсе нужно определить метод с именем параметра
// Вызов этого метода вернёт значение параметра, переданного в аннотацию
public @interface CustomAnnotation {
    String value() default "debug";
}

MyInterface.java

// Интерфейс
public interface MyInterface {
    int identity(int value);
}

MyClass.java

// Класс, реализующий интерфейс
public class MyClass implements MyInterface {
    int identity(int value) {
        return value;
    }
}

Прокси

Proxy – это особый объект, с помощью которого можно управлять доступом к свойствам практически любых объектов. Прокси может менять поведение исходного объекта. Proxy оборачивает исходный объект и перехватывает запросы к нему. Прикладной код не должен знать, что он работает не с исходным объектом, а с Proxy.

// Обернём в прокси
// Метод newProxyInstance() создаёт новый экземпляр прокси
// На вход принимает getClassLoader для класса, массив реализуемых интерфейсов и обработчик вызова
MyInterface proxyInstance = Proxy.newProxyInstance(
    MyClass.class.getClassLoader(),
    MyClass.class.getInterfaces(),
    // Лямбда - обработчик вызова
    // В качестве аргумента принимает сам объект прокси, метод, к которому происходит обращение
    // и массив аргументов, переданных при вызове
    (proxy, method, args) -> {
        // При помощи рефлексии получаем имя метода
        if (method.getName().equals("identity")) {
            return 10;
        } else {
            throw new UnsupportedOperationException(
                "Unsupported method: " + method.getName()
            );
        }
    }
);

proxyInstance.identity(5); // 10
proxyInstance.getValue(); // Exception

Reflection.java

// Отметим класс аннотацией
@CustomAnnotation(value = "Hexlet")
public class Example {
    public void foo() {

    }
}

При помощи рефлексии можно получить доступ к аннотации и её параметрам
Example example = new Example();

// Проверка наличия аннотации у класса
Example.class.isAnnotationPresent(CustomAnnotation.class);

// Получение аннотации
example.getClass().getAnnotation(CustomAnnotation.class);

// Получение значения параметра, переданного в аннотацию
example
    // Получаем класс объекта
    .getClass()
    // Получаем аннотацию класса CustomAnnotation
    .getAnnotation(CustomAnnotation.class)
    // Вызываем метод аннотации для получения значения параметра
    .value(); // "Hexlet"

// Вызов метода

example.getClass().getMethod("foo").invoke(example)

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
8 декабря 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу