JDK内置注解
@Override 注解
- 限定重写父类方法,该注解只能用于方法
 
父类:
public class Person {public void eat(){System.out.println("父类eat");}}
子类:
public class Student extends Person {/*@Override作用:限定重写的方法,只要重写方法有问题,就有错误提示*/public void eat(){System.out.println("子类eat");}}
Deprecated 注解
- 用于表示所修饰的元素(类、方法、构造器、属性等)
已过时。通常是因为所修饰的结构危险或存在更好的选择/*在方法前加入 @Deprecated,这个方法就会变成一个废弃方法/过期方法/过时方法*/@Deprecatedpublic void study(){System.out.println("学习");}}
public class Test {public static void main(String[] args) {new Student().study();}}
 
@Suppresswarnings 注解
- 抑制编译器警告
```java
public class Test {
  public static void main(String[] args) {
@SuppressWarnings("unused")//未被使用警告int num = 10;
 
@SuppressWarnings({"unused","rwatypes"})//未被使用警告,范型警告ArrayList a = new ArrayList();}
}
<a name="pm3Hf"></a>## 自定义注解> - 自定义注解使用很少,一般情况下都是使用现成的注解�注解的声明很像接口的声明,只比接口多了一个@符号(@interface)。下面就是一个最简单的注解:```javapublic @interface Test {}
这个注解没有任何的注解元素,不包含任何元素的注解称为
标记注解,反之称为元数据
注解元素
上面的Test是一个注解,但是它并没有什么作用。当我们需要注解提供一些信息时,就需要为注解提供一些注解元素了。注解元素是什么呢?看下面这个例子:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Student {int id();String name() default "嘿嘿";}
id和name就是两个注解元素,name通过default声明了自己的默认值,如果在注解某个方法的时候,没有给出name的值,就会使用默认值。
这两个元素其实都是字段,但是是以方法的形式声明的,为什么要以方法的形式声明而不是直接声明字段呢?因为反编译后的Student就是一个继承了Annotation的接口。接口中是不能有成员变量的,所以注解提供了这种特殊的声明字段的方式来给出注解元素。
注解元素的限制
注解元素的类型是有限制的,可以作为注解元素的类型有:
- 基本数据类型
 - String类型
 - class类型
 - 枚举类型
 - 注解类型
 - 所有以上类型的数组
 
默认值限制
注解元素除了类型有限制外,默认值也有限制。首先,每个注解元素要么有默认值,也就是在定义注解时通过default给定,要么就在使用注解时给定。如果两者都没有,就会出现编译错误。
此外,任何非基本类型的注解元素,无论是在注解声明时给定的默认值,还是在使用注解时给定的值,都不能是null。看下面这个示例:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Student {int id();String name() default "嘿嘿";}
StudentTest方法在使用注解时给定name为null,编译器给出了错误信息。
使用注解
(1)定义了元素,就必须给元素进行赋值
@MyAnnotation(value = {"abc","he","xi"})public class Person {}
(2)  如果只有一个元素,并且这个元素名字为value的话,那么value =可以省略不写
@MyAnnotation({"abc","he","xi"})public class Person {}
(3) 如果元素设置默认值,那么使用就无需传值
public @interface MyAnnotation2 {String value() default "abc";}
@MyAnnotation2public class Person {}
(4) 一个注解的内部是可以不定义元素
public @interface MyAnnotation3 {}
元注解
- 用来修饰其他注解的注解
 
@Target
表示该注解用于什么地方,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR:构造器声明ElemenetType.**FIELD**:字段声明(包括 enum 实例)ElemenetType.LOCAL_VARIABLE:局部变量声明ElemenetType.**METHOD**:方法声明ElemenetType.PACKAGE:包声明ElemenetType.PARAMETER:参数声明ElemenetType.**TYPE**:类、接口(包括注解类型)、enum@Retention
表示注解信息
**保存时长**。可选的RetentionPolicy 参数包括:RetentionPolicy.SOURCE:注解将被编译器丢弃RetentionPolicy.CLASS:注解在**class**文件中可用,但会被**VM**丢弃RetentionPolicy.**RUNTIME**: VM将在运行期也保留注释,因此可以通过**反射机制读取注解的信息**。@Documented
将此注解包含在**javadoc**中 ,它代表着此注解会被**javadoc**工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited
允许子类继承父类中的注解。
@Repeatable
允许一个注解可以被使用一次或者多次

