JDK内置注解

@Override 注解

  • 限定重写父类方法,该注解只能用于方法

父类:

  1. public class Person {
  2. public void eat(){
  3. System.out.println("父类eat");
  4. }
  5. }

子类:

  1. public class Student extends Person {
  2. /*
  3. @Override作用:限定重写的方法,只要重写方法有问题,就有错误提示
  4. */
  5. public void eat(){
  6. System.out.println("子类eat");
  7. }
  8. }

Deprecated 注解

  • 用于表示所修饰的元素(类、方法、构造器、属性等)已过时。通常是因为所修饰的结构危险或存在更好的选择
    1. /*
    2. 在方法前加入 @Deprecated,这个方法就会变成一个废弃方法/过期方法/过时方法
    3. */
    4. @Deprecated
    5. public void study(){
    6. System.out.println("学习");
    7. }
    8. }
    1. public class Test {
    2. public static void main(String[] args) {
    3. new Student().study();
    4. }
    5. }

@Suppresswarnings 注解

  • 抑制编译器警告 ```java public class Test { public static void main(String[] args) {
    1. @SuppressWarnings("unused")//未被使用警告
    2. int num = 10;
  1. @SuppressWarnings({"unused","rwatypes"})//未被使用警告,范型警告
  2. ArrayList a = new ArrayList();
  3. }

}

  1. <a name="pm3Hf"></a>
  2. ## 自定义注解
  3. > - 自定义注解使用很少,一般情况下都是使用现成的注解
  4. �注解的声明很像接口的声明,只比接口多了一个@符号(@interface)。下面就是一个最简单的注解:
  5. ```java
  6. public @interface Test {
  7. }

这个注解没有任何的注解元素,不包含任何元素的注解称为标记注解,反之称为元数据


注解元素

上面的Test是一个注解,但是它并没有什么作用。当我们需要注解提供一些信息时,就需要为注解提供一些注解元素了。注解元素是什么呢?看下面这个例子:

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Student {
  4. int id();
  5. String name() default "嘿嘿";
  6. }

idname就是两个注解元素name通过default声明了自己的默认值,如果在注解某个方法的时候,没有给出name的值,就会使用默认值。
这两个元素其实都是字段,但是是以方法的形式声明的,为什么要以方法的形式声明而不是直接声明字段呢?因为反编译后的Student就是一个继承了Annotation的接口。接口中是不能有成员变量的,所以注解提供了这种特殊的声明字段的方式来给出注解元素。

注解元素的限制

注解元素的类型是有限制的,可以作为注解元素的类型有:

  • 基本数据类型
  • String类型
  • class类型
  • 枚举类型
  • 注解类型
  • 所有以上类型的数组

默认值限制

注解元素除了类型有限制外,默认值也有限制。首先,每个注解元素要么有默认值,也就是在定义注解时通过default给定,要么就在使用注解时给定。如果两者都没有,就会出现编译错误。

此外,任何非基本类型的注解元素,无论是在注解声明时给定的默认值,还是在使用注解时给定的值,都不能是null。看下面这个示例:

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface Student {
  4. int id();
  5. String name() default "嘿嘿";
  6. }

image.png

StudentTest方法在使用注解时给定name为null,编译器给出了错误信息。

使用注解

(1)定义了元素,就必须给元素进行赋值

  1. @MyAnnotation(value = {"abc","he","xi"})
  2. public class Person {
  3. }

(2) 如果只有一个元素,并且这个元素名字为value的话,那么value =可以省略不写

  1. @MyAnnotation({"abc","he","xi"})
  2. public class Person {
  3. }

(3) 如果元素设置默认值,那么使用就无需传值

  1. public @interface MyAnnotation2 {
  2. String value() default "abc";
  3. }
  1. @MyAnnotation2
  2. public class Person {
  3. }

(4) 一个注解的内部是可以不定义元素

  1. public @interface MyAnnotation3 {
  2. }

元注解

  • 用来修饰其他注解的注解

@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

允许一个注解可以被使用一次或者多次