# 预定义的注解类型

> 原文： [https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html](https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html)

Java SE API 中预定义了一组注解类型。 Java 编译器使用某些注解类型，有些注解类型适用于其他注解。

## Java 语言使用的注解类型

`java.lang`中定义的预定义注解类型是`@Deprecated`，`@Override`和`@SuppressWarnings`。

**@Deprecated** [`@Deprecated`](https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html) 注解表示标记的元素是 _ 已弃用 _，不应再使用。只要程序使用带有`@Deprecated`注解的方法，类或字段，编译器就会生成警告。不推荐使用元素时，也应使用 Javadoc `@deprecated`标记对其进行记录，如以下示例所示。在 Javadoc 注解和注解中使用 at 符号（`@`）并非巧合：它们在概念上是相关的。另请注意，Javadoc 标记以小写 _d_ 开头，注解以大写 _D_ 开头。

```
   // Javadoc comment follows
    /**
     * @deprecated
     * explanation of why it was deprecated
     */
    @Deprecated
    static void deprecatedMethod() { }
}

```

**@Override** [`@Override`](https://docs.oracle.com/javase/8/docs/api/java/lang/Override.html) 注解通知编译器该元素是要覆盖超类中声明的元素。覆盖方法将在[接口和继承](../IandI/index.html)中讨论。

```
   // mark method as a superclass method
   // that has been overridden
   @Override 
   int overriddenMethod() { }

```

虽然在重写方法时不需要使用此批注，但它有助于防止出错。如果标有`@Override`的方法无法正确覆盖其某个超类中的方法，则编译器会生成错误。

**@SuppressWarnings** [`@SuppressWarnings`](https://docs.oracle.com/javase/8/docs/api/java/lang/SuppressWarnings.html) 注解告诉编译器抑制否则会生成的特定警告。在以下示例中，使用了不推荐使用的方法，编译器通常会生成警告。但是，在这种情况下，注解会导致警告被抑制。

```
   // use a deprecated method and tell 
   // compiler not to generate a warning
   @SuppressWarnings("deprecation")
    void useDeprecatedMethod() {
        // deprecation warning
        // - suppressed
        objectOne.deprecatedMethod();
    }

```

每个编译器警告都属于一个类别。 Java 语言规范列出了两个类别：`deprecation`和`unchecked`。当与[泛型](../generics/index.html)出现之前编写的遗留代码接口时，可能会发生`unchecked`警告。要禁止多种类别的警告，请使用以下语法：

```
@SuppressWarnings({"unchecked", "deprecation"})

```

**@SafeVarargs** [`@SafeVarargs`](https://docs.oracle.com/javase/8/docs/api/java/lang/SafeVarargs.html) 注解，当应用于方法或构造函数时，断言代码不对其`varargs`参数执行可能不安全的操作。使用此注解类型时，将禁止与`varargs`使用相关的未检查警告。

**@FunctionalInterface** [`@FunctionalInterface`](https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html) 注解，在 Java SE 8 中引入，表明类型声明旨在成为 Java 语言规范定义的函数式接口。

## 适用于其他注解的注解

适用于其他注解的注解称为 _ 元注解 _。 `java.lang.annotation`中定义了几种元注解类型。

**@Retention** [`@Retention`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html) 注解指定标记注解的存储方式：

*   `RetentionPolicy.SOURCE` - 标记的注解仅保留在源级别中，并被编译器忽略。
*   `RetentionPolicy.CLASS` - 标记的注解在编译时由编译器保留，但 Java 虚拟机（JVM）会忽略。
*   `RetentionPolicy.RUNTIME` - 标记的注解由 JVM 保留，因此运行时环境可以使用它。

**@Documented** [`@Documented`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Documented.html) 注解表示每当使用指定的注解时，应使用 Javadoc 工具记录这些元素。 （默认情况下，注解不包含在 Javadoc 中。）有关更多信息，请参阅 [Javadoc 工具页面](https://docs.oracle.com/javase/8/docs/technotes/guides/javadoc/index.html)。

**@Target** [`@Target`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html) 注解标记另一个注解，以限制可以应用注解的 Java 元素类型。目标注解指定以下元素类型之一作为其值：

*   `ElementType.ANNOTATION_TYPE`可以应用于注解类型。
*   `ElementType.CONSTRUCTOR`可以应用于构造函数。
*   `ElementType.FIELD`可以应用于字段或属性。
*   `ElementType.LOCAL_VARIABLE`可以应用于局部变量。
*   `ElementType.METHOD`可以应用于方法级注解。
*   `ElementType.PACKAGE`可以应用于包声明。
*   `ElementType.PARAMETER`可以应用于方法的参数。
*   `ElementType.TYPE`可以应用于类的任何元素。

**@Inherited** [`@Inherited`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Inherited.html) 注解表示注解类型可以从超类继承。 （默认情况下不是这样。）当用户查询注解类型并且该类没有此类型的注解时，将查询类的超类以获取注解类型。此注解仅适用于类声明。

**@Repeatable** [`@Repeatable`](https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Repeatable.html) 注解，在 Java SE 8 中引入，表明标记的注解可以多次应用于相同的声明或类型使用。有关更多信息，请参阅[重复注解](repeating.html)。