Страницы

Поиск по вопросам

вторник, 9 апреля 2019 г.

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

Хочу написать свои аннотации, так как возникло несколько идей, но не могу понять как это сделать. Вроде легко, но вопрос: как к аннотации прикрепить бизнес логику? Что я могу сделать с теми данными которые мне пришли в аннотации. пример: @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

Комментариев нет:

Отправить комментарий