An "annotation" is a type of programming
language definition and used as a “marker”. They can be thought as comment
lines which programming language engine can understand. They don’t directly
affect program execution but affect indirecly if wanted.
Definition
An annotation is defined with @interface keyword and is similar with
an interface. It has attributes which are defined like interface methods.
Attributes can have default values. Let’s define an annotation named “Page”,
which defines UI pages of an application:
public @interface Page {
int id();
String url();
String icon()
default "[none]";
String name();
default "[none]";
}
Usage
Annotations are widely used to inform
compiler or compile-time/runtime/deployment-time processing.
Usage of
an annotation is simpler:
@Page(id=1, url=”studentView”, icon=“icons/student.png”,
name=”Students”)
public class StudentWindow extends Window { … }
Annotations
can also be defined for methods and attributes:
@AnAnnotation
public String getElementName() {…}
@AnAnnotation(type=”manager”, score=3)
public int income;
Examples
1)
Reflection/code generation:
Methods having
a specific annotation can be processed at runtime:
public @interface MyAnnotation { ... }
public class TestClass {
@MyAnnotation
public static method1() { ... }
@MyAnnotation
public static method2() { ... }
@MyAnnotation
public static method3() { ... }
}
public static void main(String[] args) {
for (Method method : Class.forName("TestClass").getMethods()) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
// do what you want
}
}
}
2)
Spring bean configuration (this section requires Spring bean configuration
knowledge):
Let’s use
our “Page” annotation again:
package com.cmp.annotation;
public @interface Page {
int id();
String url();
String icon() default "[none]";
String name(); default "[none]";
}
Say that
we have a few classes having @Page annotation in a package:
@Page(id=1, url=”studentView”, icon=“icons/student.png”, name=”Students”)
public class StudentWindow extends Window { … }
If we
define a bean configuration as below in a Spring application-context.xml file, Spring
will create class instances “which has @Page annotation” placed in “given
package”.
<context:component-scan base-package="com.cmp.ui" annotation-config="true">
<context:include-filter type="annotation" expression="com.cmp.annotation.Page"/>
context:component-scan>
So, we have
been enforced Spring to instantiate only a selection of classes at runtime.
For more detailed info about annotations, please refer to: