Подтвердить что ты не робот

Как создать пользовательскую аннотацию в java?

Я хочу создать пользовательскую аннотацию в java для DirtyChecking. Как и я хочу сравнить два строковых значения, используя эту аннотацию, и после сравнения вернет значение boolean.

Например: я поместил @DirtyCheck("newValue","oldValue") поверх свойств.

Предположим, что я создал интерфейс:

 public @interface DirtyCheck {
    String newValue();
    String oldValue();
 }

Мои вопросы:

  • Где я создаю класс для создания метода сравнения для двух строковых значений? Я имею в виду, как эта аннотация уведомляет, что этот метод мне нужно вызвать?
  • Как вернуть возвращаемые значения этого метода?
4b9b3361

Ответ 1

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DirtyCheck {
    String newValue();
    String oldValue();
}

Затем вам нужно написать let say DirtyChecker class, который будет использовать отражение, чтобы проверить, имеет ли метод аннотацию, и выполнить некоторую работу, например, если oldValue и newValue равны:

final class DirtyChecker {

    public boolean process(Object instance) {
        Class<?> clazz = instance.getClass();
        for (Method m : clazz.getDeclaredMethods()) {
            if (m.isAnnotationPresent(DirtyCheck.class)) {
                DirtyCheck annotation = m.getAnnotation(DirtyCheck.class);
                String newVal = annotation.newValue();
                String oldVal = annotation.oldValue();
                return newVal.equals(oldVal);
            }
        }
        return false;
    }
}

Cheers, Михал

Ответ 2

Чтобы ответить на второй вопрос: ваша аннотация не может вернуть значение. Класс, который обрабатывает вашу аннотацию, может что-то сделать с вашим объектом. Это обычно используется для ведения журнала, например. Я не уверен, что использование аннотации для проверки, является ли объект грязным, имеет смысл, за исключением того, что вы хотите сделать исключение в этом случае или сообщить какой-то DirtyHandler.

Для вашего первого вопроса: вы могли бы потратить некоторое время на то, чтобы найти это самостоятельно. Здесь достаточно информации о потоке stackoverflow и в Интернете.

Ответ 3

CustomAnnotation.java

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
     int studentAge() default 21;
     String studentName();
     String stuAddress();
     String stuStream() default "CS";
}

Как использовать поле аннотации в Java?

TestCustomAnnotation.java

package annotations;
import java.lang.reflect.Method;
public class TestCustomAnnotation {
     public static void main(String[] args) {
           new TestCustomAnnotation().testAnnotation();
     }
     @CustomAnnotation(
                studentName="Rajesh",
                stuAddress="Mathura, India"
     )
     public void testAnnotation() {
           try {
                Class<? extends TestCustomAnnotation> cls = this.getClass();
                Method method = cls.getMethod("testAnnotation");

                CustomAnnotation myAnno = method.getAnnotation(CustomAnnotation.class);

                System.out.println("Name: "+myAnno.studentName());
                System.out.println("Address: "+myAnno.stuAddress());
                System.out.println("Age: "+myAnno.studentAge());
                System.out.println("Stream: "+myAnno.stuStream());

           } catch (NoSuchMethodException e) {
           }
     }
}
Output:
Name: Rajesh
Address: Mathura, India
Age: 21
Stream: CS

Ссылка