Java 注解
定义
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
使用注解
@注解名称
作用分类
-
编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
-
代码分析:通过代码里标识的注解对代码进行分析【使用反射】
-
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
元注解
用于描述注解的注解
-
@Target
:描述注解能够作用的位置ElementType.TYPE
:可以应用于类、接口(包括注解类型)或枚举声明。ElementType.METHOD
:可以应用于方法级注解。ElementType.FIELD
:可以应用于成员变量上。ElementType.PARAMETER
:可以应用于方法的参数。ElementType.CONSTRUCTOR
:可以应用于构造函数。ElementType.LOCAL_VARIABLE
:可以应用于局部变量。ElementType.ANNOTATION_TYPE
:可以应用于注解类型。ElementType.PACKAGE
:可以应用于包声明。ElementType.TYPE_PARAMETER
(Java 8新增):可以应用于类型参数。ElementType.TYPE_USE
(Java 8新增):可以应用于任何使用类型的地方。
-
@Retention
:描述注解被保留的阶段RetentionPolicy.SOURCE
:表示注解信息只在源代码级别保留,编译器使用它然后丢弃,它不会被包含在编译后的.class文件中。这通常用于标记性注解,比如覆盖检查,在编译时进行检查,之后不再需要。如果@Override
注解里的@Retention(RetentionPolicy.SOURCE)
就不会编译到class文件中。RetentionPolicy.CLASS
:注解在编译时被保留,在类文件中存在,但JVM在运行时不保留。这是默认行为。RetentionPolicy.RUNTIME
:注解在运行时被保留,可以通过反射机制读取注解的信息。
-
@Documented
:指示将此注解包含在Javadoc中,没有特定的取值。 -
@Inherited
:指示子类可以继承父类中的注解,没有特定的取值。 -
@Repeatable
:(Java 8新增)允许在单一元素上多次使用相同的注解,没有特定的取值。
JDK中预定义的一些注解
@Override
重写超类型中的方法声明
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
指示方法声明旨在重写超类型中的方法声明。如果方法具有此批注类型,则编译器需要生成错误消息,除非至少满足以下条件之一:
- 该方法重写或实现在超类型中声明的方法。
- 该方法具有一个签名,该签名等效于 Object 中声明的任何公共方法的签名。
@Deprecated:该注解标注的内容,表示已过时
该注解标注的内容,表示已过时
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
/**
* 返回已弃用批注元素的版本。版本字符串的格式和命名空间与 javadoc 标记的值 @since 相同。默认值为空字符串。
*
* @return 版本字符串
* @since 9
*/
String since() default "";
/**
* 指示在将来的版本中是否要删除带批注的元素。缺省值为 false。
*
* @return 元素是否需要删除
* @since 9
*/
boolean forRemoval() default false;
}
带 @Deprecated 注释的程序元素是程序员不鼓励使用的元素。一个元素可能由于以下几个原因而被弃用,例如,它的使用可能会导致错误;它可能会在不兼容的情况下更改或在将来的版本中删除;它已被一种更新的、通常更可取的替代方案所取代;或者它已经过时了。
当在未弃用的代码中使用或重写已弃用的程序元素时,编译器会发出警告。 @Deprecated 在局部变量声明、参数声明或包声明上使用批注对编译器发出的警告没有影响。
当某个模块被弃用时,在 中使用该模块 requires而不是 in exports 或 opens 子句会导致发出警告。不推荐使用的模块不会导致对模块内类型的使用发出警告。
此注释类型具有字符串值元素 since。此元素的值指示首次弃用带批注的程序元素的版本。
此注释类型具有布尔值元素 forRemoval。值 true 表示在将来的版本中删除带批注的程序元素的意图。值 false 表示不鼓励使用带批注的程序元素,但在批注程序元素时,没有删除它的特定意图。
@SuppressWarnings
压制警告
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
一般传递参数all @SuppressWarnings("all")
自定义注解
格式
元注解
public @interface 注解名称{
属性列表;
}
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {
}
属性:接口中的抽象方法
要求:
-
属性的返回值类型有下列取值
- 基本数据类型(四类八种)
- String
- 枚举
- 注解
- 以上类型的数组
-
定义了属性,在使用时需要给属性赋值
- 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
- 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
- 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略