前言
1 Java注解基础
注解是JDK1.5版本开始引入的一个特性,用于对程序代码的说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。
它主要的作用有以下四方面:
- 生成javadoc文档,通过在代码里面标识元数据生成javadoc文档。
- 编译期的检查,通过标识的元数据让编译器在编译期间对代码进行验证。
- 编译时动态处理,编译时通过代码中标识的元数据动态处理,比如动态生成代码。
- 运行时动态处理,运行时通过代码中标识的元数据动态处理,比如使用反射技术注入实例。
注解的常见分类有三种:
- Java自带的标准注解 ,包括 @Override、@Deprecated和@SuppressWarnings,分别代表 方法重写、某个类或方法过时、以及忽略警告,用这些注解标明后编译器就会进行检查。
- 元注解 ,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented 等6种
- @Retention:指定其所修饰的注解的保留策略
- @Document:该注解是一个标记注解,用于指示一个注解将被文档化
- @Target:用来限制注解的使用范围
- @Inherited:该注解使父类的注解能被其子类继承
- @Repeatable:该注解是Java8新增的注解,用于开发重复注解
- 类型注解(Type Annotation):该注解是Java8新增的注解,可以用在任何用到类型的地方
- 自定义注解 ,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。
接下来我们通过这三种分类来逐一理解注解。
1.1 Java内置注解
我们先从Java内置注解开始说起,先看下下面的代码:
class Parent { public void rewriteMethod() { } } class Child extends Parent { /** * 重载父类的 rewriteMethod() 方法 */ @Override public void rewriteMethod() { } /** * 被弃用的过时方法 */ @Deprecated public void oldMethod() { } /** * 忽略告警 * * @return */ @SuppressWarnings("keep run") public List infoList() { List list = new ArrayList(); return list; } }
Java 1.5开始自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings:
@Override
:表示当前类中的方法定义将覆盖父类中的方法@Deprecated
:表示该代码段被弃用,但是可以使用,只是编译器会发出警告而已@SuppressWarnings
:表示关闭编译器的警告信息
我们再具体看下这几个内置注解,同时通过这几个内置注解中的元注解的定义来引出元注解。
1.1.1 内置注解 - @Override
我们先来看一下这个注解类型的定义:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
从它的定义我们可以看到,这个注解可以被用来修饰方法,并且它只在编译时有效,在编译后的class文件中便不再存在。这个注解的作用我们大家都不陌生,那就是告诉编译器被修饰的方法是重写的父类的中的相同签名的方法,编译器会对此做出检查,
若发现父类中不存在这个方法或是存在的方法签名不同,则会报错。
1.1.2 内置注解 - @Deprecated
这个注解的定义如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
从它的定义我们可以知道,它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。这个注解的作用是告诉编译器被修饰的程序元素已被“废弃”,不再建议用户使用。
1.1.3 内置注解 - @SuppressWarnings
这个注解我们也比较常用到,先来看下它的定义:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }
它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。它的作用是告诉编译器忽略指定的警告信息,它可以取的值如下所示:
参数 | 作用 | 原描述 |
---|---|---|
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 | 抑制确在switch中缺失breaks的警告 | to suppress warnings relative to missing breaks in switch statements |
finally | 抑制finally模块没有返回的警告 | to suppress warnings relative to finally block that don’t return |
hiding | 抑制与隐藏变数的区域变数相关的警告 | to suppress warnings relative to locals that hide variable() |
incomplete-switch | 忽略没有完整的switch语句 | to suppress warnings relative to missing entries in a switch statement (enum case) |
nls | 忽略非nls格式的字符 | to suppress warnings relative to non-nls st |