Friday, May 2, 2014

Java Custom Annotations Example

Annotation: ClassAnnotation.java


package com.pkm.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) //can use in class only.
public @interface ClassAnnotation {
    public enum Priority {
        LOW, MEDIUM, HIGH
     }

     Priority priority() default Priority.HIGH;

     String[] tags() default "";

     String name() default "Pritom";

     String date() default "02/05/2014";
}

Annotation: MethodAnnotation.java


package com.pkm.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) //can use in method only.
public @interface MethodAnnotation {
    public boolean enabled() default false; 
}

Annotation: FieldAnnotation.java


package com.pkm.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD) //can use in field only.
public @interface FieldAnnotation {
    public boolean required() default false; 
    public boolean blank() default true;
    public int min() default 0;
    public int max() default 255;
}

Example Usage Of Custom Annotation: Example.java


package com.pkm.annotation;

@ClassAnnotation(name = "Pritom Kumar Mondal", priority = ClassAnnotation.Priority.MEDIUM, 
        tags = {"Pritom", "Kumar", "Mondal"})
public class Example {    
    @FieldAnnotation(required = true, blank = false, min = 10, max = 15)
    String name;
    
    @MethodAnnotation(enabled = true)
    void method1() {
        if(true) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }
    }
    
    @MethodAnnotation(enabled = false)
    void method2() {
        if(true) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }
    }
    
    @MethodAnnotation()
    void method3() {
        if(true) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }
    }
}

Example Runner Class: RunExample.java


package com.pkm.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class RunExample {
    public static void main(String[] args) throws Exception {
        RunExample runExample = new RunExample();
        Example example = new Example();
        example.name = "Pritom Kumar Mondal";
        try {
            RunExample.validate(example);
            System.out.println("\n\nInfo: Validation successful");
        } catch (Exception ex) {
            System.out.println("\n\nError: " + ex.getMessage());
        }
    }
    
    public static boolean validate(Object object) throws Exception {
        Class obj = object.getClass();
        /* Process @ClassAnnotation */
        if (obj.isAnnotationPresent(ClassAnnotation.class)) {
            Annotation annotation = obj.getAnnotation(ClassAnnotation.class);
            ClassAnnotation classAnnotation = (ClassAnnotation) annotation;
            
            System.out.printf("%nPriority :%s", classAnnotation.priority());
            System.out.printf("%nCreatedBy :%s", classAnnotation.name());
            System.out.printf("%nTags :");
            int tagLength = classAnnotation.tags().length;
            for (String tag : classAnnotation.tags()) {
                if (tagLength > 1) {
                    System.out.print(tag + " ||| ");
                } else {
                    System.out.print(tag);
                }
                tagLength--;
            }

            System.out.printf("%nDate :%s%n%n", classAnnotation.date());
        }
        
        /* Process @MethodAnnotation */
        for (Method method : obj.getDeclaredMethods()) {
            if (method.isAnnotationPresent(MethodAnnotation.class)) {
                Annotation annotation = method.getAnnotation(MethodAnnotation.class);
                MethodAnnotation methodAnnotation = (MethodAnnotation) annotation;
                if(methodAnnotation.enabled()) {
                    System.out.println(method.getName() +" is enabled");
                } else {
                    System.out.println(method.getName() +" is not enabled");
                }
            }
        }
        
        /* Process @FieldAnnotation */
        for (Field field : obj.getDeclaredFields()) {
            if (field.isAnnotationPresent(FieldAnnotation.class)) {
                Annotation annotation = field.getAnnotation(FieldAnnotation.class);
                FieldAnnotation methodAnnotation = (FieldAnnotation) annotation;
                field.setAccessible(true);
                Object value = field.get(object);
                
                /* Checking: required */
                if(methodAnnotation.required()) {
                    System.out.println(field.getName() +" is required with value: " + value);
                    if(value == null) {
                        throw new Exception(field.getName() + " is required");
                    }
                } else {
                    System.out.println(field.getName() +" is not required");
                }
                
                /* Checking: blank */
                if(!methodAnnotation.blank()) {
                    System.out.println(field.getName() +" not blank with value: " + value);
                    if(value == null || value.toString().trim().length() == 0) {
                        throw new Exception(field.getName() + " not blank");
                    }
                } else {
                    System.out.println(field.getName() +" can blank");
                }
                
                /* Checking: min */
                System.out.println(field.getName() +" min length: " + methodAnnotation.min());
                if(value != null && value.toString().trim().length() < methodAnnotation.min()) {
                    throw new Exception(field.getName() + " must min length: " + methodAnnotation.min());
                }
                
                /* Checking: max */
                System.out.println(field.getName() +" max length: " + methodAnnotation.max());
                if(value != null && value.toString().trim().length() > methodAnnotation.max()) {
                    throw new Exception(field.getName() + " must max length: " + methodAnnotation.max());
                }
            }
        }
        return true;
    }
}

Example Output:


Priority :MEDIUM
CreatedBy :Pritom Kumar Mondal
Tags :Pritom ||| Kumar ||| Mondal
Date :02/05/2014

method1 is enabled
method2 is not enabled
method3 is not enabled
name is required with value: Pritom Kumar Mondal
name not blank with value: Pritom Kumar Mondal
name min length: 10
name max length: 15


Error: name must max length: 15

No comments:

Post a Comment