我们常常看到在一个子类重写父类的某个方法的时候,在这个子类重写的父类方法的前面会出现一行@Override,这个就是注解,它表示一个方法声明打算重写超类的另一个方法声明。如果方法利用此注释类型进行注解但是却没有重写超类的方法,则编译器会生成一条错误信息。还有如:@SuppressWarnings()指示应该在注释元素中取消显示指定的编译器警告。还可以自己定义自己的注解类型,格式如下:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation {
String value();
}
上面定义了一个名叫MyAnnotation的注解类型,String value表示需要传递一个字符串类型的值给value属性。可以使用Target注解类型指示该自定义注解类型所适用的程序元素种类。
ElementType.TYPE表示使用于类、接口或枚举声明。使用注解类型Retention来指示该注解类型要保留多久,RetentionPolicy.RUNTIME表示编译器将把注解记录在类文件中,在运行时VM将保留注解,因此可以反射性的读取。@Document表示该注解可以被写到文档里面。@Inherited表示该注解可以被子类继承,但是@Target必须的属性值必须为ElementType.TYPE才能被继承。
对于大多数Programmer而言,在JPA中,Annotation其实就是OR-Mapping XML文件的替代者。注意,JPA中的Annotation都是RUMTIME的,从灵活性的角度将,我们往往希望使用配置文件而不是Annotation。
下面是我common-util下的一个关于Java代码的注释:终于通过这个例子让我彻底掌握了Annotation这东东。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaSource {
String author() default "treeClimber"; /* 作者 */
String email() default "xionglb@163.com"; /* 联系E_Mail */
String company() default "http://www.treeclimber.cn/"; /* 公司名 */
String project() default "common-util"; /* 所属项目 */
String descript(); /* 类描述 */
float version() default 1.0f; /* 版本号 */
String created(); /* 创建时间 */
}
@Target( { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LastModified {
int year();
int month();
int date();
String modifier();
String descript();
String format() default "yyyy-MM-dd";
}
@JavaSource(version = 1.5f, project = "demoproj", descript = "学习Java5 Annotation", created = "2010-04-12")
public class JavaSourceTest {
@LastModified(modifier = "xiongsl", year = 2010, month = 5, date = 5, descript = "Add the Method")
public void say(String world) {
System.out.println("Hello, " + world);
}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
if (JavaSourceTest.class.isAnnotationPresent(JavaSource.class)) {
JavaSource anno = JavaSourceTest.class.getAnnotation(JavaSource.class);
System.out.println("Author:" + anno.author());
System.out.println("Company:" + anno.company());
System.out.println("Descript:" + anno.descript());
}
try {
Method m = JavaSourceTest.class.getDeclaredMethod("say", String.class);
LastModified anno = m.getAnnotation(LastModified.class);
Date date = new Date(anno.year(), anno.month() - 1, anno.date());
System.out.println("LastModified by " + anno.modifier() + " At "
+ new SimpleDateFormat(anno.format()).format(date) + ", Note:"
+ anno.descript());
} catch (Exception e) {
e.printStackTrace();
}
}