Friday, January 23, 2009

Java Annotation

Annotations on Annotations(Meta Annotation)

J2SE 5.0 provides four annotations in the java.lang.annotation package that are used only when writing annotations:

    @Documented—Whether to put the annotation in Javadocs
    @Retention—When the annotation is needed
    @Target—Places the annotation can go
    @Inherited—Whether subclasses get the annotation

These four annotations are used while creating custom Annotations and are called Meta Annotations.

The Target annotation

The target annotation indicates the targeted elements of a class in which the annotation type will be applicable. It contains the following enumerated types as its value:

     @Target(ElementType.TYPE)—can be applied to any element of a class
     @Target(ElementType.FIELD)—can be applied to a field or property
     @Target(ElementType.METHOD)—can be applied to a method level annotation
     @Target(ElementType.PARAMETER)—can be applied to the parameters of a method
     @Target(ElementType.CONSTRUCTOR)—can be applied to constructors
     @Target(ElementType.LOCAL_VARIABLE)—can be applied to local variables
     @Target(ElementType.ANNOTATION_TYPE)—indicates that the declared type itself is an annotation type


The Retention annotation

The retention annotation indicates where and how long annotations with this type are to be retained. There are three values:

RetentionPolicy.SOURCE—Annotations with this type will be by retained only at the source level and will be ignored by the compiler
RetentionPolicy.CLASS—Annotations with this type will be by retained by the compiler at compile time, but will be ignored by the VM
RetentionPolicy.RUNTIME—Annotations with this type will be retained by the VM so they can be read only at run-time


The Documented annotation

The documented annotation indicates that an annotation with this type should be documented by the javadoc tool.
By default, annotations are not included in javadoc. But if @Documented is used, it then will be processed by javadoc-like tools and the annotation type information will also be included in the generated document.

The Inherited annotation

In general annotations are not inherited by child classes from parent classes.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    String loggerName();
}

@MyAnnotation
class Super {
  @Oneway public void foo() {

  }
}

class Sub extends Super {
  public void foo() {
  
  }
}


Above case Sub does not have the MyAnnotation annotation.
If an annotation type has the meta-annotation @Inherited  then an annotation of that type on a class will cause the annotation to be inherited by sub-classes. So, in the example above, if the MyAnnotation type had the @Inherited attribute, then Sub  would have the MyAnnotation annotation.




No comments :

Post a Comment