1.什么是注解
Annotation is code about the code, that is metadata about the program itself.
Java注解,是Java5.0引入的一种插入源代码中用于某种工具处理的标签。注解不会改变程序的编译方式和运行结果,但能被编译器、注解工具或其他工具解析。
2.注解的使用
在一般的Java开发中,最常接触到的可能就是@Override和@SupressWarnings这两个注解了。使用@Override的时候只需要一个简单的声明即可。这种称为标记注解(marker annotation ),它的出现就代表了某种配置语义。
其它的注解是可以有自己的配置参数的。配置参数以名值对的方式出现。使用 @SupressWarnings的时候需要类似@SupressWarnings({"uncheck", "unused"})这样的语法。在括号里面的是该注解可供配置的值。由于这个注解只有一个配置参数,该参数的名称默认为value,并且可以省略。而花括号则表示是数组类型。如:
public interface IPlatformProperties { @Value("database.url") String databaseURL(); @Value("database.login") String databaseLogin(); @Value("database.mac") String databaseMAC(); @Value("publisher.from.socket") boolean isFromSocket(); @Value("publisher.buffersize") int ringbufferSize(); }
3.注解的语法
每个注解必须通过一个注解接口进行定义,接口中的方法与注解中的元素相对应。例如:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Value { /** * The actual value expression: e.g. "#{systemProperties.myProp}". */ String value(); }
又或者带有默认值的注解定义:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Assignment { String assignee(); int effort(); double finished() default 0; }
@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。在这里可以看到@Retention和@Target这样的元注解,用来声明注解本身的行为。@Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。
一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息;相反,@Deprecated里面的Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被Deprecated。
除了@Retention和@Target这样的元注解,还有@Documented和@Inherited这两个注解。
4.处理注解
根据,@Retention元注解的定义,注解可以在编译期间和运行时处理。一般来说,在运行时利用反射,取得注解的具体值,然后进行处理,例子在这里。编译期间的注解处理还没遇过,不过可以参考这里的例子。
本文完
参考:
http://javapapers.com/core-java/java-annotations/
http://www.infoq.com/cn/articles/cf-java-annotation
http://www.iteye.com/topic/36659