注解机制
注解
概念:注解是绑定到程序源代码元素的元数据,对运行代码的操作没有影响。
@Deprecated
概念:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告
@Deprecated
特征: 有划线
1.该注解修饰某个元素,表示该元素已经过时
2.即不推荐使用,但可以用
// @Deprecated 定义
@Documented // 能生成javadoc文档
@Retention(RetentionPolicy.RUNTIME) // 保留至运行时期间
// 可以添加在 构造器 成员变量 局部变量 成员方法 包 方法参数 (类、接口、枚举类)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
// 返回注释元素被弃用的java版本
String since() default "";
// 指示带注释的元素是否会在未来版本中被删除
boolean forRemoval() default false;
}
@Override
概念:表示当前的方法定义将覆盖父类中的方法
// @Override的定义
@Target(ElementType.METHOD) // 可以添加在成员方法
@Retention(RetentionPolicy.SOURCE) // 只在编译时有效
public @interface Override { // @interface 不是接口,代表注解(jdk5.0之后添加)
}
@SuppressWarnings
概念:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告
// @SuppressWarnings定义
// 使用格式:@SuppressWarning({"","",""...});
// 例子:@SuppressWarning({"all"}); 抑制所有警告
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。它的作用是告诉编译器忽略指定的警告信息,它可以取的值如下所示:
| 参数 | 作用 |
|---|---|
| all | 抑制所有警告 |
| boxing | 抑制装箱、拆箱操作时候的警告 |
| cast | 抑制映射相关的警告 |
| dep-ann | 抑制启用注释的警告 |
| deprecation | 抑制过期方法警告 |
| fallthrough | 抑制确在switch中缺失breaks的警告 |
| finally | 抑制finally模块没有返回的警告 |
| hiding | 抑制与隐藏变数的区域变数相关的警告 |
| incomplete-switch | 忽略没有完整的switch语句 |
| nls | 忽略非nls格式的字符 |
| null | 忽略对null的操作 |
| rawtype | 使用generics时忽略没有指定相应的类型 |
| restriction | 抑制与使用不建议或禁止参照相关的警告 |
| serial | 忽略在serializable类中没有声明serialVersionUID变量 |
| static-access | 抑制不正确的静态访问方式警告 |
| synthetic-access | 抑制子类没有按最优方法访问内部类的警告 |
| unchecked | 抑制没有进行类型检查操作的警告 |
| unqualified-field-access | 抑制没有权限访问的域的警告 |
| unused | 抑制没被使用过的代码的警告 |
元注解
概念: 元注解是用于定义注解的注解
@Target
指定注解可以在哪些地方使用(如 @Target(ElementType.METHOD) // 方法中使用 )
public enum ElementType {
// 类、接口(包括注解类型)、枚举或记录声明
TYPE,
// 字段声明(包括枚举常量)
FIELD,
// 方法声明
METHOD,
// 普通参数声明
PARAMETER,
// 构造函数声明
CONSTRUCTOR,
// 局部变量声明
LOCAL_VARIABLE,
// 注解类型声明
ANNOTATION_TYPE,
// 包声明
PACKAGE,
// 类型参数声明 since jdk1.8
TYPE_PARAMETER,
// 使用类型 since jdk1.8
TYPE_USE,
// 模块声明 since jdk9
MODULE,
}
@Retention
指定注解的作用范围,三种策略:SOURCE,CLASS,RUNTIME,定义在RetentionPolicy枚举中
- RetentionPolicy.SOURCE 源文件保留
- RetentionPolicy.CLASS 编译期保留
- RetentionPolicy.RUNTIME 运行期保留,可通过反射去获取注解信息
@Documented
描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息
@Inherited
子类会继承父类的注解
// @Override的源码案例分析
@Target(ElementType.METHOD) // 方法中使用
@Retention(RetentionPolicy.SOURCE) // 该注解主要是用于编译,所以在编译之后丢弃
public @interface Override { // @interface 不是接口,代表注解(jdk5.0之后添加)
}
测试代码
// 自定义注解类 TestInheritedAnnotation
// 使用元注解@Inherited
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@interface TestInheritedAnnotation {
String [] values();
int number();
}
// 父类
@TestInheritedAnnotation(values = {"lns"}, number = 100)
class Person {
}
// 子类
class Student extends Person{
public static void main(String[] args) {
// RetentionPolicy.RUNTIME 注解保存至运行期间,所以可以通过反射获取该注解
Class cls = Student.class;
Annotation[] annotations = cls.getAnnotations();
for (Annotation anno : annotations) {
System.out.println(anno.toString());
}
}
}
// 结果
@com.Al_tair.mhlProject.view.TestInheritedAnnotation(values={"lns"}, number=100)
@Native (jdk8)
使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用(了解)
@Repeatable (jdk8)
重复注解:允许在同一申明类型(类,属性,或方法)的多次使用同一个注解
作用:仅仅是为了提高代码可读性