1 注解(Annotation)
官方解释:Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
通俗解释:注解就相当于一种规则,在某个类中使用了某个注解,就会触发这种规则。JAVA注解有三种类型,一种是内置注解(JAVA官方定义的注解可以直接用),一种是元注解(注解的注解,用来定义注解类时使用的注解),最后是自定义注解(自定义注解要用到元注解来定义)。元注解就是最底层的注解,用来定义其他注解。
内置注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
@Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:
关键字 | 用途 |
all | to suppress all warnings(抑制所有警告) |
boxing | to suppress warnings relative to boxing/unboxing operations(要抑制与箱/非装箱操作相关的警告) |
cast | to suppress warnings relative to cast operations(为了抑制与强制转换操作相关的警告) |
dep-ann | to suppress warnings relative to deprecated annotation(要抑制相对于弃用注释的警告) |
deprecation | to suppress warnings relative to deprecation(要抑制相对于弃用的警告) |
fallthrough | to suppress warnings relative to missing breaks in switch statements(在switch语句中,抑制与缺失中断相关的警告) |
finally | to suppress warnings relative to finally block that don’t return(为了抑制警告,相对于最终阻止不返回的警告) |
hiding | to suppress warnings relative to locals that hide variable(为了抑制本地隐藏变量的警告) |
incomplete-switch | to suppress warnings relative to missing entries in a switch statement (enum case)(为了在switch语句(enum案例)中抑制相对于缺失条目的警告) |
nls | to suppress warnings relative to non-nls string literals(要抑制相对于非nls字符串字面量的警告) |
null | to suppress warnings relative to null analysis(为了抑制与null分析相关的警告) |
rawtypes | to suppress warnings relative to un-specific types when using generics on class params(在类params上使用泛型时,要抑制相对于非特异性类型的警告) |
restriction | to suppress warnings relative to usage of discouraged or forbidden references(禁止使用警告或禁止引用的警告) |
serial | to suppress warnings relative to missing serialVersionUID field for a serializable class(为了一个可串行化的类,为了抑制相对于缺失的serialVersionUID字段的警告) |
static-access | o suppress warnings relative to incorrect static access(o抑制与不正确的静态访问相关的警告) |
synthetic-access | to suppress warnings relative to unoptimized access from inner classes(相对于内部类的未优化访问,来抑制警告) |
unchecked | to suppress warnings relative to unchecked operations(相对于不受约束的操作,抑制警告) |
unqualified-field-access | to suppress warnings relative to field access unqualified(为了抑制与现场访问相关的警告) |
unused | to suppress warnings relative to unused code(抑制没有使用过代码的警告) |
元注解
@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented - 标记这些注解是否包含在用户文档中。
@Target - 标记这个注解应该是哪种 Java 成员。
@Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
定义注解
通过几个案例来展示怎么定义注解
案例一:
//标记这些注解是否包含在用户文档中
//用于描述域
({FIELD, TYPE})
//运行时保留
(RUNTIME)
//自定义一个注解
public @interface AnimalUser {
//注解中包含两个变量,并且初始化
int id() default 123;
String name() default "小三";
}
//添加自定义的注解
//创建一个用户类
public class User {
//用户类中的两个属性
private int id;
private String name;
}
//创建测试类
public class Demo {
public static void main(String[] args) throws NoSuchFieldException {
//反射一个USER对象
var m = User.class;
//输出对应字段内容
System.out.println(m.getAnnotation(AnimalUser.class).name());
System.out.println(m.getAnnotation(AnimalUser.class).id());
}
}
案例二:
ElementType.FIELD)(
(RetentionPolicy.RUNTIME)
public @interface AnimalUser {
//注解中包含两个变量,并且初始化
int id() default 123;
String name() default "小三";
}
//创建一个用户类
public class User {//添加自定义的注解
private String user;
}
//创建测试类
public class Demo {
public static void main(String[] args) throws NoSuchFieldException {
//反射一个USER对象
var m = User.class;
//判断类USER中的注解是否含有对应的字段
var a = m.getDeclaredField("user");
//输出对应字段内容
System.out.println(a.getAnnotation(AnimalUser.class).name());
System.out.println(a.getAnnotation(AnimalUser.class).id());
}
}
两个案例中的区别