Before we go further it is better to discuss some of the key factors of java annotations.
- java annotations were introduced to the java world with JDK 5 (JSR 175)
- Annotations are providing a strong mechanism to define meta data .
- It improve readability of the code .
- Can use in every where inside the code
- Easy to define (no need of long set of configurations)
- Multi value annotations
- Single value annotations
- Marker annotations
It is easy to understand other two types of annotations if we define Multi value annotations so lets begin our new annotations as a multi value.
/** * @author amith jayasekara * * simple multi value annotation */ @interface MultivalueAnotaion { String message(); //this will set mata data print number to 23 if there is // no explicitly deceleration int printNumber() default 23; }
We define annotation with @interface . Then we can define over own methods inside the annotation class but keep in mind as interfaces annotation cannot have methods with body . So keep body of the method as empty .There are some restrictions while define method inside annotation.
- Return type of method should be a primitive value or an Object type.
- Or it can be a enum or other annotation type.
- Or it can be array of above types .
- No other return types are allows to use with annotation methods.
- And there can not be generics in side annotations.
Improving above annotation .
We can improve annotation with following two properties .
- What extend the this annotation is retained .
- Where we use this annotation.
To do that we can use another pre defined annotation called @Retention. There are 3 retaliation policies are defined with this annotation.
- RetentionPolicy.RUNTIME
- RetentionPolicy.CLASS(default type)
- RetentionPolicy.SOURCE
Define where to use annotation.
To do that we can user another pre defined annotation called @Target . Follow are available options . Note that we can define more that one definition but it will give compiler error if we used same definition more that one inside the Element type array.
example :
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
this will give compile errors
check out available options for Element types here
So now we see the improved version of our multi valued annotation.
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author amith jayasekara * * simple multi value annotation that retain in runtime and that * can be used in class level */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface MultivalueAnotaion { String message(); //this will set mata data print number to 23 if there is // no explicitly deceleration int printNumber() default 23; }
Now we know how to define a simple annotation but it is no use if we don't know how to use this annotation . Follow is a sample code that define the usage of the annotation.
import java.lang.annotation.Annotation; /** * @author amith jayasekara * sample code for testing annotation in runtime of the programme */ @MultivalueAnotaion(message = "sample message") public class MultivalueAnnotationTest { public static void main(String[] args) { //we create a object of the class MultivalueAnnotationTest test = new MultivalueAnnotationTest(); //check is annotation is available if (test.getClass().isAnnotationPresent(MultivalueAnotaion.class)) { MultivalueAnotaion ma = test.getClass().getAnnotation(MultivalueAnotaion.class); System.out.println("annotation message " + ma.message()); System.out.println("annotation print number " + ma.printNumber()); } } }
Single value annotation
There is only method definition inside the annotation class.
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author amith jayasekara * single value annotation * retain till runtime and only be able to apply for method level */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface SingleValueAnnotation { boolean isPrintMessage() default true; }
sample usage
import java.lang.reflect.Method; /** * @author amith jayasekara */ public class SingleValueAnnotationTest { @SingleValueAnnotation public static void annotatedMethod() { SingleValueAnnotationTest st = new SingleValueAnnotationTest(); Class cls = st.getClass(); try { Method method = cls.getMethod("annotatedMethod"); SingleValueAnnotation ano = method.getAnnotation(SingleValueAnnotation.class); System.out.println("is print message " + ano.isPrintMessage()); } catch (NoSuchMethodException e) { System.out.println("no method found"); } } public static void main(String[] args) { annotatedMethod(); } }
Marker annotation
If the annotation body does not contain any method that type of annotations are known as marker annotation . And their behavior is very much similar to marker interfaces.
Follow is a sample marker annotation and sample usage code for that annotation
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * marker annotations * this annotation is available in runtime and the target is class level */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface MyMarker { }
sample usage class
/** * @author amith jayasekara */ public class MarkerAnoTest { public static void main(String[] args) { MarkerClass mark = new MarkerClass(); if (mark.getClass().isAnnotationPresent(MyMarker.class)) { System.out.println("Mark is marked with marker annotation"); } } }
There are many pre defined annotation are available with java if you are really interesting with what are they go through follow links .
devx.com
nice useful article , can u explain the advantage of using annotations from the view of performance computing ?
ReplyDelete