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

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

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

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

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

Мои вопросы .

  1. Где я делаю класс для создания метода для сравнения двух строковых значений? Я имею в виду, как эта аннотация сообщает, что этот метод мне нужно вызвать?
  2. Как получить возвращаемые значения этого метода?
12 голосов | спросил psisodia 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 04 Sep 2012 13:00:09 +0400 2012, 13:00:09

3 ответа


0

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

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

Затем вы должны написать, скажем, класс DirtyChecker, который будет использовать отражение, чтобы проверить, есть ли у метода аннотации, и выполнить какую-то работу, например, сказать если 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, Михал

ответил Michal 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 04 Sep 2012 13:11:12 +0400 2012, 13:11:12
0

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

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

ответил Kai 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 04 Sep 2012 13:12:09 +0400 2012, 13:12:09
0

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

ссылка

ответил Rajesh Dixit 28 WedEurope/Moscow2016-12-28T20:56:03+03:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2016 20:56:03 +0300 2016, 20:56:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132