美文网首页
Java泛型自定义注解参数与默认值

Java泛型自定义注解参数与默认值

作者: bug喵喵 | 来源:发表于2020-12-03 14:16 被阅读0次

    注解参数与默认值

    注解参数

    每 1个 Annotation 都与 1个 RetentionPolicy 关联,并且与 1~n 个 ElementType 关联

    ElementType 关键字:==@Target== 下面为参数说明:

    TYPE : 标注"类、接口(包括注释类型)或枚举声明"。
    
    FIELD : 标注"字段声明"。
    
    METHOD : 标注"方法"。
    
    PARAMETER : 标注"参数"。
    
    CONSTRUCTOR : 标注"构造方法"。
    
    LOCAL_VARIABLE : 标注"局部变量"。
    

    RetentionPolicy 关键字:==@Retention== 下面为参数说明:

    SOURCE :
    Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。
    例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。
    
    CLASS :
    编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。
    
    RUNTIME :
    编译器将 Annotation 存储于 class 文件中,并且可由JVM读入。
    

    @Deprecated

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Deprecated {
    }
    

    说明:

    1. @interface -- 它的用来修饰 Deprecated,意味着 Deprecated 实现了
      java.lang.annotation.Annotation 接口;即 Deprecated 就是一个注解。
    2. @Documented -- 它的作用是说明该注解能出现在 javadoc 中。
    3. @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定 Deprecated 的策略是
      RetentionPolicy.RUNTIME。这就意味着,编译器会将Deprecated 的信息保留在 .class
      文件中,并且能被虚拟机读取。
    4. @Deprecated 所标注内容,不再被建议使用。

    例如:若某个方法被 @Deprecated 标注,则该方法不再被建议使用。如果有开发人员试图使用或重写被 @Deprecated 标示的方法,编译器会给相应的提示信息。

    @Inherited

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Inherited {
    }
    

    说明:

    1. @interface -- 它的用来修饰 Inherited,意味着 Inherited 实现了
      java.lang.annotation.Annotation 接口;即 Inherited 就是一个注解。
    2. @Documented -- 它的作用是说明该注解能出现在 javadoc 中。
    3. @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定 Inherited 的策略是
      RetentionPolicy.RUNTIME。这就意味着,编译器会将 Inherited 的信息保留在 .class
      文件中,并且能被虚拟机读取。
    4. @Target(ElementType.ANNOTATION_TYPE) -- 它的作用是指定 Inherited 的类型是
      ANNOTATION_TYPE。这就意味着,@Inherited 只能被用来标注 "Annotation 类型"。
    5. @Inherited 的含义是,它所标注的Annotation将具有继承性。

    例如:我们定义了某个 Annotaion,它的名称是 MyAnnotation,并且 MyAnnotation 被标注为 @Inherited。现在,某个类 Base 使用了
    MyAnnotation,则 Base 具有了"具有了注解 MyAnnotation";现在,Sub 继承了 Base,由于 MyAnnotation 是 @Inherited的(具有继承性),所以,Sub 也 "具有了注解 MyAnnotation"。

    @SuppressWarnings

    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }
    

    说明:

    1. @interface -- 它的用来修饰 SuppressWarnings,意味着 SuppressWarnings 实现了
      java.lang.annotation.Annotation 接口;即 SuppressWarnings 就是一个注解。
    2. @Retention(RetentionPolicy.SOURCE) -- 它的作用是指定 SuppressWarnings 的策略是
      RetentionPolicy.SOURCE。这就意味着,SuppressWarnings 信息仅存在于编译器处理期间,编译器处理完之后
      SuppressWarnings 就没有作用了。
    3. @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
      LOCAL_VARIABLE}) -- 它的作用是指定 SuppressWarnings 的类型同时包括TYPE, FIELD,
      METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
    4. String[] value(); 意味着,SuppressWarnings 能指定参数
    5. SuppressWarnings 的作用是,让编译器对"它所标注的内容"的某些警告保持静默。

    例如:"@SuppressWarnings(value={"deprecation", "unchecked"})" 表示对"它所标注的内容"中的 "SuppressWarnings 不再建议使用警告"和"未检查的转换时的警告"保持沉默。

    补充:SuppressWarnings 常用的关键字

    deprecation  -- 使用了不赞成使用的类或方法时的警告
    unchecked    -- 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。
    fallthrough  -- 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。
    path         -- 在类路径、源文件路径等中有不存在的路径时的警告。
    serial       -- 当在可序列化的类上缺少 serialVersionUID 定义时的警告。
    finally      -- 任何 finally 子句不能正常完成时的警告。
    all          -- 关于以上所有情况的警告。
    

    默认值

    自定义注解时使用以下语法定义默认值:

    public @interface MyAnnotation {
        String value() default "默认值";
    }
    

    键字 default 指定默认值。

    默认值必须是与元素的数据类型兼容的类型。

    以下代码通过将其minor元素的默认值指定为零来创建Version注释类型,如下所示:

    public  @interface  Version {
        int major();
        int minor() default 0; 
    }
    

    例子

    以下代码显示如何使用默认值使用注释。

    @Version(major=1) // 这里没有指定minor 所有这里的使用的时默认值0
    @Version(major=2, minor=1) // 
    

    以下代码显示如何为数组和其他数据类型指定默认值:

    public @interface Version {
      double d() default 1.89;
    
      int num() default 1;
    
      int[] x() default { 1, 2 };
    
      String s() default "Hello";
    
      String[] s2() default { "abc", "xyz" };
    
      Class c() default Exception.class;
    
      Class[] c2() default { Exception.class, java.io.IOException.class };
    }
    

    相关文章

      网友评论

          本文标题:Java泛型自定义注解参数与默认值

          本文链接:https://www.haomeiwen.com/subject/lqymwktx.html