Retention Policy
A retention policy determines at what point an annotation is discarded.
Java defines three such policies:SOURCE, CLASS, and RUNTIME.
- SOURCE is retained only in the source file and is discarded during compilation.
- CLASS is stored in the .class file during compilation. It is not available through the JVM during run time.
- RUNTIME is stored in the .class file and is available through the JVM during run time.
A retention policy is specified for an annotation by using one of Java's built-in annotations:
@Retention.
Its general form is shown here:
@Retention(retention-policy)
retention-policy must be one of SOURCE, CLASS, and RUNTIME.
The default policy is CLASS.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String str();
int val();
}
Obtaining Annotations at Run Time by Use of Reflection
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
// An annotation type declaration.
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String str();
int val();
}
public class Main {
@MyAnno(str = "Annotation Example", val = 100)
public static void myMeth() {
Main ob = new Main();
try {
Class c = ob.getClass();
Method m = c.getMethod("myMeth");
MyAnno anno = m.getAnnotation(MyAnno.class);
System.out.println(anno.str() + " " + anno.val());
} catch (NoSuchMethodException exc) {
System.out.println("Method Not Found.");
}
}
public static void main(String args[]) {
myMeth();
}
}
Obtaining All Annotations
You can obtain all annotations that have RUNTIME retention that are associated with an item by calling getAnnotations( ) on that item. It has this general form:
Annotation[ ] getAnnotations( )
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String str();
int val();
}
@Retention(RetentionPolicy.RUNTIME)
@interface What {
String description();
}
@What(description = "An annotation")
@MyAnno(str = "Meta2", val = 99)
public class Main {
@What(description = "test method")
@MyAnno(str = "Testing", val = 100)
public static void myMeth() throws Exception {
Main ob = new Main();
Annotation annos[] = ob.getClass().getAnnotations();
System.out.println("All annotations for Meta2:");
for (Annotation a : annos) {
System.out.println(a);
}
Method m = ob.getClass().getMethod("myMeth");
annos = m.getAnnotations();
for (Annotation a : annos) {
System.out.println(a);
}
}
public static void main(String args[]) throws Exception {
myMeth();
}
}