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 开始支持,标识某注解可以在同一个声明上使用多次。

定义注解

通过几个案例来展示怎么定义注解
案例一:

//标记这些注解是否包含在用户文档中
@Documented
//用于描述域
@Target({FIELD, TYPE})
//运行时保留
@Retention(RUNTIME)
//自定义一个注解
public @interface AnimalUser {
//注解中包含两个变量,并且初始化
int id() default 123;

String name() default "小三";
}
//添加自定义的注解
@AnimalUser
//创建一个用户类
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());


}
}

案例二

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnimalUser {
//注解中包含两个变量,并且初始化
int id() default 123;

String name() default "小三";
}
//创建一个用户类
public class User {//添加自定义的注解
@AnimalUser
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());


}
}

两个案例中的区别

认真阅读完这篇文章熟练掌握JAVA关于注解——案例源码分析_自定义