1. 注解的作用
注解有三个作用,分别体现在三个阶段。
- 第一个阶段是编译阶段,注解可以给编译器提供信息,根据这些信息,编译器可以采取相应的行动,例如检查错误或者取消警告等等。
- 第二个阶段是编译和部署阶段,在这个过程中,编译器可以根据注解使用反射的手段生成特定的代码。
- 第三个阶段是运行时,有些注解可以指定在运行时奏效,根据这些注解不同的规则措施等会被应用到程序中。
2. 注解的使用场景
注解的使用场景包括两个:
- 类,类的成员,变量,方法等等。
- 类型检测,在定义变量的时候采用注解,可以提供变量有效性合法性的检测,使得程序更加健壮。
3. 注解的定义
注解是一种特殊的接口,与接口定义的形式类似,包括注解名和注解成员,形式如下:
(public) @interface Annotation{
Type annoMember();
}
在定义注解时,访问控制修饰符只能为public或者package-default。
而且注解内的成员只能为特定类型的,包括(参考这篇文章):
- 所有基本数据类型
- String
- Class类型
- enum类型
- Annotation类型
- 以上所有类型的数组形式
4. Java环境中预定义的注解
java.lang
包中五个预定义的注解:
注解 | 使用场景、方法等 |
---|---|
@Override |
在子类当中对父类中的某个方法进行重写,通过这个注释,编译器可以判断是否确实为方法重写 |
@SuppressWarning |
取消警告,包括两种:unchecked和deprecated,形式为@SuppressWarning("unchecked","deprecation")
|
@SafeVarargs |
用于屏蔽函数当中的参数未检查警告 |
@Deprecated |
用于表明某个变量、方法等等已经不再维护了,在对代码进行@Deprecated注解的时候,需要在/** sth */ 文档说明中添加@deprecated
|
@FunctionalInterface |
用于表明某个接口作为一个功能性接口而存在,即接口中只存在一个方法声明。 |
java.lang.annotation
包中有六个预定义的注解,这六个注解使用在其他注解之上,用于指定其他注解的特征:
注解 | 使用场景、方法等 |
---|---|
@Documented |
用于告知javadoc程序,某个注解要放到自动生成javadoc文件中 |
@Repeatable |
用于指明某个注解是可以重复使用的 |
@Inherited |
如果某个类写携带了使用@Inherited 注解的注解,那么这个类的子类也同样会携带 |
@Retention |
一个注解可以体现在不同的阶段,通过@Retention 指定某个注解在哪个阶段可以使用,有三个阶段:· RetentionPolicy.SOURCE · RetentionPolicy.CLASS · RetentionPolicy.RUNTIME |
@Native |
用于表明某个变量可能由native代码调用 |
@Target |
指定注解可以用在程序的哪个片段,包括8中引用场景: · ElementType.ANNOTATION_TYPE · ElementType.Field · ElementType.Method · ElementType.Class · ElementType.Package · ElementType.Constructor · ElementType.LOCAL_VARIABLE · ElementType.PARAMETER |
5. 类型注解
6. 重复注解
重复注解的形式如下:
@Repeatable
public @interface SomeInterfaces{
SomeInterface[] value();
}