Хочу написать свои аннотации, так как возникло несколько идей, но не могу понять как это сделать. Вроде легко, но вопрос: как к аннотации прикрепить бизнес логику? Что я могу сделать с теми данными которые мне пришли в аннотации. пример: @Annotation(SomeValue.VALUE). И как мне взять это велью с сделать с ним какую-то бизнес логику? Например засунуть в какой-то метод из другой библиотеки прокрутить его и вернуть значения..
Ответ
Для использования своей аннотации нужно:
Реализовать аннотацию (public @interface MyAnnotationExample c типом аннотации ElementType - например: класс/метод/конструктор/поле и т.п.).
Использовать эту аннотацию MyAnnotationExample в вашем коде (в соответствии с типом ElementType аннотации MyAnnotationExample), т.е. добавить аннотацию к классу/методу/полю/и т.п.
Реализовать обработчик этой аннотации через рефлексию
Пример #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.
Также рекомендую посмотреть темы:
В каких случаях на практике применять рефлексию, аннотации?
Зачем создавать собственные аннотации?
Аннотация в Java EE
Комментариев нет:
Отправить комментарий