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

注解参数与默认值

注解参数

每 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 };
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页