Java аннотации - реализация бизнес логики

480
08 февраля 2017, 23:59

Хочу написать свои аннотации, так как возникло несколько идей, но не могу понять как это сделать. Вроде легко, но вопрос: как к аннотации прикрепить бизнес логику? Что я могу сделать с теми данными которые мне пришли в аннотации. пример: @Annotation(SomeValue.VALUE). И как мне взять это велью с сделать с ним какую-то бизнес логику? Например засунуть в какой-то метод из другой библиотеки прокрутить его и вернуть значения..

Answer 1

Для использования своей аннотации нужно:

  1. Реализовать аннотацию (public @interface MyAnnotationExample c типом аннотации ElementType - например: класс/метод/конструктор/поле и т.п.).
  2. Использовать эту аннотацию MyAnnotationExample в вашем коде (в соответствии с типом ElementType аннотации MyAnnotationExample), т.е. добавить аннотацию к классу/методу/полю/и т.п.
  3. Реализовать обработчик этой аннотации через рефлексию.

Пример #1. Аннотация на класс и чтение аннотации класса через рефлексию.

Создадим аннотацию MyAnnotationExampleForClass:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = ElementType.TYPE) //указание что данная аннотация вешается на класс
@Retention(value = RetentionPolicy.RUNTIME) //аннотация доступна в процессе работы модуля
public @interface MyAnnotationExampleForClass {
    String name() default "default name"; //в name() мы будем хранить значения аннотации
}

Создадим класс MyClassExample с использованием аннотации MyAnnotationExampleForClass:

@MyAnnotationExampleForClass(name = "this is my annotation value!!!")
public class MyClassExample {
...
}

Создадим класс MyAnnotationProcessorExample для получения значений аннотаций:

class MyAnnotationProcessorExample {
        MyClassExample myClass = new MyClassExample();
        //получаем нашу аннотацию из нашего объекта
        MyAnnotationExampleForClass a = myClass.getClass().getAnnotation(MyAnnotationExampleForClass.class);
    System.out.println("выводим значение аннотации = " + a.name());
    System.out.println("печатаем тип аннотации со значением = " + a.toString());
    }

Пример #2. Аннотация на метод класса и чтение аннотации метода через рефлексию. Добавим еще аннотацию MyAnnotationExampleForMethod для метода:

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotationExampleForMethod {
    String name() default "default name 2";
}

Добавим в наш класс MyClassExample (из примера #1) новый метод runForest():

@MyAnnotationExampleForClass(name = "this is my annotation value!!!")
public class MyClassExample {
    @MyAnnotationExampleForMethod(name = "this is my method-annotation value")
    public void runForest() { System.out.println("Our Forest run very good!"); }
}

Создадим класс MyAnnotationProcessorExample2 для получения значений аннотаций:

class MyAnnotationProcessorExample2 {
        MyClassExample myClass = new MyClassExample();
        //получаем наш метод из нашего объекта
        Method m = tm.getClass().getMethod("runForest");
        //получаем аннотацию из нашего метода
        MyAnnotationExampleForMethod a = m.getAnnotation(TimeAnnotationMethod.class);
    System.out.println("выводим значение аннотации = " + a.name());
    System.out.println("печатаем тип аннотации со значением = " + a.toString());
    }

Теперь можно эти классы-обработчики MyAnnotationProcessorExample и MyAnnotationProcessorExample2 использовать в нужных местах для обработки бизнес-логики. Примеры привел самые примитивные, только для общего понимания. Для более полноценных реализаций нужно разбираться с понятием java reflection.

Также рекомендую посмотреть темы:

  1. В каких случаях на практике применять рефлексию, аннотации?
  2. Зачем создавать собственные аннотации?
  3. Аннотация в Java EE
READ ALSO
ошибка java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

ошибка java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

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

465
Не получается создать двумерный массив

Не получается создать двумерный массив

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

369
Структура общения клиент-сервера через ObjectOutput(Input)Stream Java

Структура общения клиент-сервера через ObjectOutput(Input)Stream Java

Помогите понять как правильно настроить структура общения через объектыСервер:

344
Конветирую класс java в kotlin

Конветирую класс java в kotlin

Конвертирую класс из java в kotlin, при условии, что класс рабочий

330