How to create custom annotation in java?

后端 未结 3 1148
难免孤独
难免孤独 2021-02-01 23:28

I want to create custom annotation in java for DirtyChecking. Like I want to compare two string values using this annotation and after comparing it will return a

相关标签:
3条回答
  • 2021-02-02 00:07

    First you need to mark if annotation is for class, field or method. Let's say it is for method: so you write this in your annotation definition:

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

    Next you have to write let's say DirtyChecker class which will use reflection to check if method has annotation and do some job for example say if oldValue and newValue are equal:

    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

    0 讨论(0)
  • 2021-02-02 00:09

    To answer your second question: your annotation can't return a value. The class which processes your annotation can do something with your object. This is commonly used for logging for example. I'm not sure if using an annotation for checking if an object is dirty makes sense except you want to throw an exception in this case or inform some kind of DirtyHandler.

    For your first question: you could really spent some effort in finding this yourself. There are enough information here on stackoverflow and the web.

    0 讨论(0)
  • 2021-02-02 00:14

    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";
    }
    

    How to use the field of Annotation in 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
    

    Reference

    0 讨论(0)
提交回复
热议问题