注解参数与默认值
注解参数
每 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 {
}
说明:
- @interface -- 它的用来修饰 Deprecated,意味着 Deprecated 实现了 java.lang.annotation.Annotation 接口;即 Deprecated 就是一个注解。
- @Documented -- 它的作用是说明该注解能出现在 javadoc 中。
- @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定 Deprecated 的策略是 RetentionPolicy.RUNTIME。这就意味着,编译器会将Deprecated 的信息保留在 .class 文件中,并且能被虚拟机读取。
- @Deprecated 所标注内容,不再被建议使用。
例如:若某个方法被 @Deprecated 标注,则该方法不再被建议使用。如果有开发人员试图使用或重写被 @Deprecated 标示的方法,编译器会给相应的提示信息。
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
说明:
- @interface -- 它的用来修饰 Inherited,意味着 Inherited 实现了 java.lang.annotation.Annotation 接口;即 Inherited 就是一个注解。
- @Documented -- 它的作用是说明该注解能出现在 javadoc 中。
- @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定 Inherited 的策略是 RetentionPolicy.RUNTIME。这就意味着,编译器会将 Inherited 的信息保留在 .class 文件中,并且能被虚拟机读取。
- @Target(ElementType.ANNOTATION_TYPE) -- 它的作用是指定 Inherited 的类型是 ANNOTATION_TYPE。这就意味着,@Inherited 只能被用来标注 "Annotation 类型"。
- @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();
}
说明:
- @interface -- 它的用来修饰 SuppressWarnings,意味着 SuppressWarnings 实现了 java.lang.annotation.Annotation 接口;即 SuppressWarnings 就是一个注解。
- @Retention(RetentionPolicy.SOURCE) -- 它的作用是指定 SuppressWarnings 的策略是 RetentionPolicy.SOURCE。这就意味着,SuppressWarnings 信息仅存在于编译器处理期间,编译器处理完之后 SuppressWarnings 就没有作用了。
- @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -- 它的作用是指定 SuppressWarnings 的类型同时包括TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
- String[] value(); 意味着,SuppressWarnings 能指定参数
- 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 };
}