Java注解:深入理解与应用

发表时间: 2022-11-09 23:53

1.1、什么是注解

Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

1.2、注解的应用

1.生成文档这是最常见的,也是java 最早提供的注解;

2.在编译时进行格式检查,如@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;

3.跟踪代码依赖性,实现替代配置文件功能,比较常见的是spring 2.5 开始的基于注解配置,作用就是减少配置;

4.在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口,可以在反射中解析并使用 Annotation。

1.3、Java自带的标准注解(内置注解)

包括@Override、@Deprecated、@SuppressWarnings等,使用这些注解后编译器就会进行检查。

@Override

简单来说@override注解是告诉编译器,下面的方法是重写父类的方法。如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。而且加上此注解后,程序会自动屏蔽父类的方法。

@Deprecated

此注解可以用在方法,属性,类上,表示不推荐程序员使用,但是还可以使用。在新版本中有其他方法或类可以代替这个使用,以后的版本也不会再更新这个方法或类

@SuppressWarnings

作用是屏蔽一些无关紧要的警告。使开发者能看到一些他们真正关心的警告。从而提高开发者的效率。可以标注在类、字段、方法、参数、构造方法,以及局部变量上。告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。

示例:@SuppressWarnings(“unchecked”)告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。@SuppressWarnings(“unchecked”, “deprecation”)告诉编译器同时忽略unchecked和deprecation的警告信息。@SuppressWarnings(value={“unchecked”, “deprecation”})等同于@SuppressWarnings(“unchecked”, “deprecation”)抑制所有类型的警告:@SuppressWarnings(“all”)public void test(){     }

1.4、Java元注解

元注解是java API提供的,是用于修饰注解的注解,通常用在注解的定义上

@Target (重点:目标限定)

@Retention (重点:保存策略限定)

@Documented

@Inherited

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MthCache {   String key();}


@Target 注解

功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。

ElementType的取值包含以下几种:

TYPE:类,接口或者枚举

FIELD:域,包含枚举常量

METHOD:方法

PARAMETER:参数

CONSTRUCTOR:构造方法

LOCAL_VARIABLE:局部变量

ANNOTATION_TYPE:注解类型

PACKAGE:包


@Retention 注解
功能:指明修饰的注解的生存周期,即会保留到哪个阶段。

RetentionPolicy的取值包含以下三种:

SOURCE:注解只保留在源码中,当Java文件编译成class文件的时候,注解被遗弃;

CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。

RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。

这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。

上面三种类型生命周期:SOURCE<CLASS<RUNTIME,使用RUNTIME会包含前面两个生命周期,同样如果使用CLASS也会包含SOURCE的生命周期。

@Documented 注解
功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。

@Inherited注解
功能:允许子类继承父类中的注解。