Java注解(Annotation)
Java Annotation又称Java标注,是JDK5.0引入的一种注释机制。Java语言中的类、方法、变量、参数和包等都可以被标注。Java注解可以通过反射获取标注内容。
内置的注解
作用在代码中的注解:
- @Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的借口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(元注解):
- @Retention - 标识这个注解怎么保存,是在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标识这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种Java成员。
- @Inherited - 标记这个注解将具有继承性。例如,父类标注的这个注解,则其子类也默认会标注这个注解(默认:注解并没有继承于任何子类)
从Java 7开始,额外添加了3个注解:
- @SafeVarargs - Java 7开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java8开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8开始支持,标识某注解可以在同一个声明上使用多次。
Annotation架构
- 1个Annotation和一个RetentionPolicy关联,和1至多个ElementType关联。
- Annotation就是个接口,有许多实现类,包括:Deprecated,Documented,Inherited,Override等等。每一个实现类,都和一个RetentionPolicy关联,并且和一至多个ElementType关联。
- ElementType是Enum枚举类型,它用来指定Annotation的类型。
- RetentionPolicy是Enum枚举类型,它用来指定Annotation的策略,不同RetentionPolicy类型的Annotation的作用域不同。
java自带的 Annotation
- Annotation通用定义
@Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation1 { }
- @interface:
使用@interface定义注解时,意味着它实现了java.lang.annotation.Annotation
接口,即该注解就是一个Annotation。定义Annotation时,@interface是必须的。Annotation接口的实现细节都由编译器完成。通过@interface定义注解后,该注解不能继承其他的注解或接口。 - @Documented:
类和方法的Annotation在缺省情况下是不出现在javadoc中的。如果使用@Documented修饰该Anootation,则表示它可以出现在javadoc中。该注解可有可无。 - @Target(ElementType.TYPE)
指定Annota类型属性。该注解可有可无,若没有@Target,则该Annotation可以用于任何地方。 - @Retention(RetentionPolicy.RUNTIME)
指定Annotation的策略属性。默认是RetentionPolicy.CLASS。
- @interface:
Annotation的作用
Annotation是一个辅助类,它在Junit、Struts、Spring等工具框架中被广泛使用。在编程中经常会使用到的Annotation作用有:
- 编译检查
Annotation具有让编译器进行编译检查的作用,例如@SuppressWarnings,@Deprecated,@Override都具有编译检查作用。 - 在反射中使用Annotation
在反射的Class,Method,Field等函数中,有许多与Annotation相关的接口。
这意味着,我们可以在反射中解析并使用Annotation。 - 根据Annotation生成帮助文档
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。 - 能够帮忙查看代码
- 可以通过自定义Annotation来实现一些功能。