注解
注解(Annotation)是从 JDK5.0 开始引入的,以 @注解名
在代码中存在。
注解 可以像修饰符一样被使用,可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 name = value
键值对中。
常用注解
注解 | 描述 |
---|---|
@Override | 让编译器检查该方法是否正确地实现了覆写,该注解只能用于方法 |
@Deprecated | 用于表示修饰的元素(类、方法)已过时 |
@SuppressWarnings | 告诉编译器忽略此处代码产生的警告 |
@SuppressWarnings 指定要忽略的警告类型(了解)
类型 | 描述 |
---|---|
all | 抑制所有警告 |
unchecked | 抑制与未检查的作业相关的警告 |
unused | 抑制定义了但是未使用的变量 |
deprecation | 抑制与淘汰的相关警告 |
null | 抑制与空值分析相关的警告 |
rawtypes | 抑制与使用 raw 类型相关的警告 |
static-access | 抑制与静态存取不正确相关的警告 |
static-method | 抑制与可能宣告为 static 的方法相关的警告 |
super | 抑制与置换方法相关但不含 super 呼叫的警告 |
java
class Person {
private String name;
private int age;
@Deprecated
public Person(String name, int age) {
this.age = age;
this.name = name;
}
public void eat() {
System.out.println("人吃饭...");
}
}
class Student extends Person {
@Override
public void eat() {
System.out.println("学生吃饭...");
}
}
java
public static void main(String[] args) {
Person p3 = new Person("王一博", 20); //报警告,表示构造函数已过时
@SuppressWarnings("unused") int num = 10; //抑制警告,默认会报变量未使用的警告
}
元注解
有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。
类型 | 描述 |
---|---|
@Target | 用于描述注解的使用范围,如某注解只能用于类/接口,或者只能用于方法 |
@Retention | 用于描述注解的生命周期,有 SOURCE、CLASS(默认)、RUNTIME 三种,只有 RUNTIME 阶段可以被反射读取到 |
@Repeatable | 可以定义注解是否可以重复,了解 |
@Documented | 被标注的方法在生成 doc 文档时会出现,了解 |
@Inherited | 允许子类继承父类的注解,仅针对@Target(ElementType.TYPE) 类型的注解有效,了解 |
使用 @Deprecated 已过时注解作为示例:
java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
String since() default "";
boolean forRemoval() default false;
}
自定义注解
一个完整的注解应该包含三个部分:声明、使用、读取。
java
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
@Retention(RUNTIME)
public @interface MyAnnotation {
int type() default 0;
String value() default "hello"; //使用default关键字指定value默认值
}
java
@MyAnnotation(value = "class")
class Person {
private String name;
private int age;
@MyAnnotation()
public Person() {
}
}
TIP
- 自定义注解可以通过 4 个元注解分别说明 生命周期、使用位置、是否被继承、是否被生成到 doc API文档中;
- 注解 以无参数有返回值的抽象方法的形式来声明,我们又成为配置参数。返回值类型只能是八种基本数据类型、String类型、Class类型、Enum类型、注解类型、以上所有类型的数组;
- 可以使用
default
关键字为抽象方法指定默认返回值;