注解机制

113 阅读4分钟

注解机制

注解

概念:注解是绑定到程序源代码元素的元数据,对运行代码的操作没有影响。

@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)

重复注解:允许在同一申明类型(类,属性,或方法)的多次使用同一个注解

重复注解详细说明

作用:仅仅是为了提高代码可读性